diff --git a/.github/workflows/closed-fixed-pending-release.yml b/.github/workflows/closed-fixed-pending-release.yml deleted file mode 100644 index 24771d103..000000000 --- a/.github/workflows/closed-fixed-pending-release.yml +++ /dev/null @@ -1,14 +0,0 @@ -name: Closed fixed-pending-release issues -on: - release: - types: [published] - -jobs: - close_fixed_pending_release: - runs-on: ubuntu-latest - steps: - - name: Close issues marked 'fixed-pending-release' - uses: gcampbell-msft/fixed-pending-release@0.0.12 - with: - token: ${{ secrets.GITHUB_TOKEN }} - label: fixed (release pending) \ No newline at end of file diff --git a/.github/workflows/triage-labels.yml b/.github/workflows/triage-labels.yml index 09713249c..09ee57abf 100644 --- a/.github/workflows/triage-labels.yml +++ b/.github/workflows/triage-labels.yml @@ -17,11 +17,3 @@ jobs: uses: andymckay/labeler@e6c4322d0397f3240f0e7e30a33b5c5df2d39e90 with: add-labels: triage - add_to_cmake_project: - runs-on: ubuntu-latest - steps: - - name: Add to CMake Project - uses: actions/add-to-project@v0.5.0 - with: - project-url: https://github.com/orgs/microsoft/projects/1024 - github-token: ${{ secrets.CMAKEPROJECT_SECRET }} diff --git a/CHANGELOG.md b/CHANGELOG.md index c7e09397d..75aa5545d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,44 @@ # What's New? +## 1.19 + +Features: + +- Add setting `cmake.useVsDeveloperEnvironment` to allow for more user control on when the Visual Studio Developer Enviornment is attempted to be added to the CMake Presets environment. [#3892](https://github.com/microsoft/vscode-cmake-tools/pull/3892) + +Improvements: + +- Add `Unspecified` option for selecting a kit variant to allow CMake itself to select the build type. [#3821](https://github.com/microsoft/vscode-cmake-tools/issues/3821) +- Skip loading variants when using CMakePresets. [#3300](https://github.com/microsoft/vscode-cmake-tools/issues/3300) +- Resolve diagnostics files relative to workspace and build directory, fixes [#1401](https://github.com/microsoft/vscode-cmake-tools/issues/1401) [@fargies](https://github.com/fargies) +- Add setting to only show the cmake log on target failure. [#3785](https://github.com/microsoft/vscode-cmake-tools/pull/3785) [@stepeos](https://github.com/stepeos) +- Preset expansion occurs on `CMakePresets.json` or `CMakeUserPresets.json` save, and if there are no errors the expanded presets are cached. The VS Developer Environment will only be applied to a preset if it is selected. Expansion errors will show in the problems panel and preset files with errors will be invalid, and any presets they contain cannot be used. [#3905](https://github.com/microsoft/vscode-cmake-tools/pull/3905) +- Remove pop-ups asking to configure, default `cmake.configureOnOpen` to `true`. [#3967](https://github.com/microsoft/vscode-cmake-tools/pull/3967) + +Bug Fixes: + +- Attempt to fix stringifying the extension context. [#3797](https://github.com/microsoft/vscode-cmake-tools/issues/3797) +- Fix issue where `cmake.preferredGenerators` wasn't falling back to the next entry when the first entry didn't exist. [#2709](https://github.com/microsoft/vscode-cmake-tools/issues/2709) +- Potential fix for attempting to load a non-variants file as a variants file and throwing a parse exception. [#3727](https://github.com/microsoft/vscode-cmake-tools/issues/3727) +- Fix issue where `cmakeUserPresets.json` not showing up in project outline. [#3832](https://github.com/microsoft/vscode-cmake-tools/issues/3832) +- Fix edge case where parsing tests fails when additional output is printed before tests json. [#3750](https://github.com/microsoft/vscode-cmake-tools/issues/3750) +- Fix issue where `Configure with CMake Debugger` fails on restart because the previously used pipe to CMake Debugger is no longer available. [#3582](https://github.com/microsoft/vscode-cmake-tools/issues/3582) +- Fix custom kit PATH being overriden. [#3849](https://github.com/microsoft/vscode-cmake-tools/issues/3849) +- Fix debug variables being overriden. [#3806](https://github.com/microsoft/vscode-cmake-tools/issues/3806) +- Fix issue in Quick Start where a C file was generated in place of a C++ file. [#3856](https://github.com/microsoft/vscode-cmake-tools/issues/3856) +- Fix custom build tasks not showing up. [#3622](https://github.com/microsoft/vscode-cmake-tools/issues/3622) +- Fix the bug where if a relative path specified for `installDir`, it is not calculated relative to the source directory, which is how it should be according to the CMake `installDir` docs [here](https://cmake.org/cmake/help/latest/manual/cmake-presets.7.html#configure-preset). [#3871](https://github.com/microsoft/vscode-cmake-tools/issues/3871) +- Fix issue with CMakeLists.txt depth search. [#3901](https://github.com/microsoft/vscode-cmake-tools/issues/3901) +- Fix localized file path for schema files. [#3872](https://github.com/microsoft/vscode-cmake-tools/issues/3872) +- Disable annoy and invalid extenion message about fix windows sdk for MSVC 2022. [#3837](https://github.com/microsoft/vscode-cmake-tools/pull/3837) +- Fix re-using a terminal for launching even when the environment has changed. [#3478](https://github.com/microsoft/vscode-cmake-tools/issues/3478) +- Fix our keybindings for debug and run without debugging to better match VS Code. [#3507](https://github.com/microsoft/vscode-cmake-tools/issues/3507) +- Allow success recovery in the configure precondition handler. [#3554](https://github.com/microsoft/vscode-cmake-tools/issues/3554) +- Prevent second configure after `QuickStart` if the `automaticReconfigure` setting is enabled. [#3910](https://github.com/microsoft/vscode-cmake-tools/issues/3910) +- Set usepresets context after manually creating a CMakePresets.json/CMakeUserPresets.json or using QuickStart to create it. [#3854](https://github.com/microsoft/vscode-cmake-tools/issues/3854) +- Only do special handling of `~` for code model reply path on linux. [#3957](https://github.com/microsoft/vscode-cmake-tools/issues/3957) +- Fix issues with expanding unnecessary environment variables and incorrectly saving preset environments to cache. Also fixes expansion error reporting issue with not checking for an invalid Configure preset in other types of presets. [#3961](https://github.com/microsoft/vscode-cmake-tools/issues/3961) & [#1841](https://github.com/microsoft/vscode-cmake-tools/issues/1841) + ## 1.18.44 Bug Fixes: @@ -23,7 +62,7 @@ Bug Fixes: - Update localized strings for Project Status UI and quick pick dropdowns. [#3803](https://github.com/microsoft/vscode-cmake-tools/issues/3803), [#3802](https://github.com/microsoft/vscode-cmake-tools/issues/3802) - Fix issue where new presets couldn't inherit from presets in CmakeUserPresets.json. These presets are now added to CmakeUserPresets.json instead of CmakePresets.json. [#3725](https://github.com/microsoft/vscode-cmake-tools/issues/3725) - Fix issue where CMakeTools does not recheck CMake Path to see if user installed CMake after launching VS Code. [3811](https://github.com/microsoft/vscode-cmake-tools/issues/3811) -- Fix issue where `cmake.buildToolArgs` was sometimes applied incorrectly when presets are used [#3754](https://github.com/microsoft/vscode-cmake-tools/issues/3754) +- Fix issue where `cmake.buildToolArgs` was sometimes applied incorrectly when presets are used. [#3754](https://github.com/microsoft/vscode-cmake-tools/issues/3754) - Fix issue where `preferredGenerator.platform` and `preferredGenerator.toolset` wasn't being compared between the old and new kit to trigger a clean configure on a kit selection change. [#2699](https://github.com/microsoft/vscode-cmake-tools/issues/2699) - Still allow for users to add `--warn-unused-cli`. Now instead of overriding, it will remove our default `--no-warn-unused-cli`. [#1090](https://github.com/microsoft/vscode-cmake-tools/issues/1090) - Ensure `useCMakePresets` context is set after making a CMakePreset.json with `Quick Start`. [#3734](https://github.com/microsoft/vscode-cmake-tools/issues/3734) @@ -35,10 +74,9 @@ Bug Fixes: - Fix tests having too long of a command-line. [#3814](https://github.com/microsoft/vscode-cmake-tools/pull/3814) ## 1.18.41 - Features: -- Add the possibility to open the current build directory in the Explorer [#1451](https://github.com/microsoft/vscode-cmake-tools/issues/1451) +- Add the possibility to open the current build directory in the Explorer. [#1451](https://github.com/microsoft/vscode-cmake-tools/issues/1451) - Add support for CMakePresets V7 and V8. [#3549](https://github.com/microsoft/vscode-cmake-tools/issues/3549) - Update `api.ts` to add the `onSelectedConfigurationChanged` event. [#3671](https://github.com/microsoft/vscode-cmake-tools/pull/3671) [@OrkunTokdemir](https://github.com/OrkunTokdemir) - Improve CMake QuickStart by allowing the user to dynamically create a CMakePresets.json file. [#3649](https://github.com/microsoft/vscode-cmake-tools/issues/3649) diff --git a/ThirdPartyNotices.txt b/ThirdPartyNotices.txt index 9492af363..76b09d662 100644 --- a/ThirdPartyNotices.txt +++ b/ThirdPartyNotices.txt @@ -312,6 +312,301 @@ Redistribution and use in source and binary forms, with or without modification, THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +--------------------------------------------------------- + +--------------------------------------------------------- + +kitware/cmake 5e984bb35232116a54de7db39788cb162ca7c263 - BSD-3-Clause + + +(c) (c) L +(c) Copyright John +Copyright Google LLC +Copyright Kitware, Inc. +Copyright (C) Howard Chu +(c) ! ISCNTRL (c) ISSPACE +Copyright 2007 Edd Dawson +Copyright 2019 Google LLC +Copyright 2020 Google LLC +Copyright 2021 Google LLC +Copyright 2023 Google LLC +Copyright by Tim Kientzle +Copyright 2011 Google Inc. +Copyright 2019 Peter Dimov +Copyright (C) Red Hat, Inc. +Copyright (c) 2007 Kai Wang +Copyright (c) Red Hat, Inc. +copyright Niels Provos. Two +Copyright (C) Björn Stenberg +Copyright (C) Michael Forney +Copyright (C) Steve Holme, . +Copyright (c) Facebook, Inc. +Copyright 2011 Kitware, Inc. +Specifies Copyright Filename +COPYRIGHT MATCHES ActiveState +Copyright (C) Daniel Stenberg +Copyright (c) Daniel Stenberg +Copyright (c) 2012 Ondrej Holy +Copyright 1995-2022 Mark Adler +Copyright (c) 2007 Tim Kientzle +Copyright (c) 2011 Andres Mejia +Copyright (c) 2011 Tim Kientzle +Copyright (c) 2012, Google Inc. +Copyright (c) 2013 Marek Kubica +Copyright (c) 2017 Sean Purcell +Copyright .txt or https://cmake +Copyright (c) 2004 MyCompanyName +Copyright (c) 2013 Konrad Kleine +Copyright (c) 2016 InfoTeCS JSC. +Copyright (c) 2003-2008 Yuta Mori +Copyright (c) 2008 Anselm Strauss +Copyright (c) 2016 Martin Matuska +Copyright (c) 2016 Tino Reichardt +Copyright (c) 2017 Martin Matuska +Copyright (c) 2017, 2018 Dell EMC +Copyright (c) 2019 Martin Matuska +Copyright (c) 2020 Martin Matuska +Copyright (c) The Qt Company Ltd. +Copyright 2010-2012 Kitware, Inc. +Copyright 2010-2018 Kitware, Inc. +Copyright 2015-2016 Kitware, Inc. +Copyright 2015-2017 Kitware, Inc. +Copyright (c) 1995-2017 Mark Adler +Copyright (c) 1995-2019 Mark Adler +Copyright (c) 1995-2022 Mark Adler +Copyright (c) 2004-2017 Mark Adler +Copyright (c) 2004-2019 Mark Adler +Copyright 2010 Firebreath Dev Team +Copyright (C) Jacob Hoffman-Andrews +Copyright (c) 1998 John D. Polstra. +Copyright (c) 2003-2018 +Copyright (c) 2004, 2010 Mark Adler +Copyright (c) Microsoft Corporation +copyright Alexander Chemeris. Three +Copyright (c) 2001 Alexander Peslyak +Copyright (c) 2003-2006 Tim Kientzle +Copyright (c) 2003-2007 Tim Kientzle +Copyright (c) 2003-2008 Tim Kientzle +Copyright (c) 2003-2009 Tim Kientzle +Copyright (c) 2003-2010 Tim Kientzle +Copyright (c) 2003-2011 Tim Kientzle +Copyright (c) 2003-2012 Tim Kientzle +Copyright (c) 2003-2015 Tim Kientzle +Copyright (c) 2004-2013 Tim Kientzle +Copyright (c) 2009-2011 Sean Purcell +Copyright (c) 2012-2014, Yann Collet +Copyright (c) 2014 Sebastian Freundt +Copyright (c) 2015 Okhotnikov Kirill +Copyright libuv project contributors +Copyright (c) 2007 Joerg Sonnenberger +Copyright (c) 2008 Joerg Sonnenberger +Copyright (c) 2009 Joerg Sonnenberger +Copyright (c) 2009 Michihiro NAKAJIMA +Copyright (c) 2010 Joerg Sonnenberger +Copyright (c) 2011 Michihiro NAKAJIMA +Copyright (c) 2012 Michihiro NAKAJIMA +Copyright (c) 2014 Michihiro NAKAJIMA +Copyright (C) " LIBCURL_COPYRIGHT "\0" +Copyright (c) 2009, Michihiro NAKAJIMA +Copyright (c) 2012 Tatsuhiro Tsujikawa +Copyright (c) 2013 Tatsuhiro Tsujikawa +Copyright (c) 2014 Tatsuhiro Tsujikawa +Copyright (c) 2015 Tatsuhiro Tsujikawa +Copyright (c) 2016 Tatsuhiro Tsujikawa +Copyright (c) 2017 ngtcp2 contributors +Copyright (C) Daniel Stenberg, , et al. +Copyright (C) Simon Josefsson, , et al. +Copyright (c) 2003-2007 Kees Zeelenberg +Copyright (c) 2012 nghttp2 contributors +Copyright (c) 2022 nghttp2 contributors +Copyright (c) 2022 nghttp3 contributors +copyright (c) 1996-2019 Julian R Seward +Copyright (c) 1995-2003, 2010 Mark Adler +Copyright (c) 1995-2005, 2010 Mark Adler +Copyright (c) 1995-2011, 2016 Mark Adler +Copyright (c) 1995-2017 Jean-loup Gailly +Copyright (c) 1995-2018 Jean-loup Gailly +Copyright (c) 1995-2021 Jean-loup Gailly +Copyright (c) 1996-1998 John D. Polstra. +Copyright (c) 1996-2019 by Julian Seward +Copyright the libuv project contributors +Copyright (c) 2001-2019 Expat maintainers +Copyright (c) Yann Collet, Facebook, Inc. +Copyright (c) 1990-1992 by Eberhard Mattes +Copyright (c) 2006-2008 Alexander Chemeris +Copyright (c) 2008-2014 Michihiro NAKAJIMA +Copyright (c) 2009-2011 Michihiro NAKAJIMA +Copyright (c) 2009-2012 Michihiro NAKAJIMA +Copyright (c) 2010-2011 Michihiro NAKAJIMA +Copyright (c) 2010-2012 Michihiro NAKAJIMA +Copyright (c) 2011-2012 Michihiro NAKAJIMA +Copyright (c) 2011-2012 libarchive Project +Copyright (c) 2016-present, Facebook, Inc. +Copyright (c) 1986 by University of Toronto +Copyright (c) 2016 Ed Schouten +Copyright (c) Internet Software Consortium. +copyrighted by the Free Software Foundation +Copyright (c) 2006 Rudolf Marek SYSGO s.r.o. +Copyright (c) 2008 - 2009 NVIDIA Corporation +Copyright (c) 2012, 2013 Tatsuhiro Tsujikawa +Copyright (c) 2013, 2014 Tatsuhiro Tsujikawa +Copyright (c) Howard Chu, +(c) 1995-2022 Jean-loup Gailly and Mark Adler +Copyright (C) Bill Nagel , Exacq Technologies +Copyright (c) Bjorn Stenberg, +Thomas E. Dickey 1996,1997 +Copyright (c) 2001 The NetBSD Foundation, Inc. +Copyright (c) 1996, David Mazieres +Copyright (c) 2009-2012,2014 Michihiro NAKAJIMA +Copyright (c) 2011-2012,2014 Michihiro NAKAJIMA +Copyright (c) 2016 Gaurav +Copyright (c) 2016 Thomas Beutlich +Copyright (c) Daniel Stenberg, +Copyright (c) Howard Chu, +Copyright 2012, Samuel Neves +copyright the Internet Systems Consortium, Inc. +Copyright (c) 2016 Eric Rahm +Copyright (c) 1991 Texas Instruments Incorporated +Copyright (c) 1998 Free Software Foundation, Inc. +Copyright (c) 2013, Sony Mobile Communications AB +Copyright (c) 2017 Viktor Szakats +Copyright (c) Hoi-Ho Chan, +Copyright (c) Nick Zitzmann, +Copyright (c) 1999, 2000, 2002 Aladdin Enterprises +Copyright (c) 2002 Thomas Moestl +Copyright (c) 2009 The Android Open Source Project +Copyright (c) 2016 Don Lewis +Copyright 2000-2016 Kitware, Inc. and Contributors +Copyright 2000-2023 Kitware, Inc. and Contributors +Copyright Joyent, Inc. and other Node contributors +Copyright (c) 2008, Damien Miller +Copyright (c) 2017 Rolf Eike Beer +Copyright (c) 2017 Vaclav Slavik +Copyright (c) Michael Forney, +Copyright 1995-2022 Jean-loup Gailly and Mark Adler +Copyright 2002 Niels Provos +Juergen Pfeifer 1995,1997 +Copyright (c) 1995-2016 Jean-loup Gailly, Mark Adler +Copyright (c) 1995-2022 Jean-loup Gailly, Mark Adler +Copyright (c) 1996-2022 Internet Software Consortium +Copyright (c) 1998, 2001 The NetBSD Foundation, Inc. +Copyright (c) 2002 Karl Waclawek +Copyright (c) 2005 Karl Waclawek +Copyright (c) 2007 Karl Waclawek +Copyright (c) 2017 Hans Wennborg +Copyright (c) 2018 Yury Gribov +Copyright (c) Marc Hoersken, +Copyright (c) Simon Josefsson, +Copyright (c) Steve Holme, +Copyright (C) 1996-2022 Internet Software Consortium. +Copyright (c) 2003-2008 Tim Kientzle and Miklos Vajna +Copyright (c) 2015-present libuv project contributors +Copyright (c) 2017 Benbuck Nason +Copyright (c) 2019 Vadim Zeitlin +Copyright (c) Linus Nielsen Feltzing, +Copyright (c) Mark Salisbury, +Copyright (c) 1998,2000 Free Software Foundation, Inc. +Copyright (c) 2000, 2001, 2008, 2011, David E. O'Brien +Copyright (c) 2005-2009 Steven Solie +Copyright (c) 2013, Ben Noordhuis +Copyright (c) 2021 Dong-hee Na +Copyright (c) 1991, 1999 Free Software Foundation, Inc. +Copyright (c) 1995-2022 Jean-loup Gailly and Mark Adler +Copyright (c) 1996-1999 by Internet Software Consortium +Copyright (c) 1996-2019 Julian Seward +Copyright (c) 2001-2004 Damien Miller +Copyright (c) 2004 by Internet Systems Consortium, Inc. +Copyright (c) 2016 Pascal Cuoq +Copyright (c) 2022 Samanta Navarro +Copyright 2012 The Open Source Electronic Health Record +Copyright (c) 2009 Andreas Henriksson +Copyright (c) 2012, 2014, 2015, 2016 Tatsuhiro Tsujikawa +Copyright (c) 2018 Anton Maklakov +Copyright (c) Florin Petriuc, +copyright Google Inc. and Sony Mobile Communications AB. +Copyright (c) 2002-2005 Karl Waclawek +Copyright (c) 2002-2006 Karl Waclawek +Copyright (c) 2002-2016 Karl Waclawek +Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors +Copyright 2011 Baptiste Lepilleur and The JsonCpp Authors +Copyright (c) 2006, Alexander Neundorf, +Copyright (c) 2016 Gustavo Grieco +Copyright (c) 2017 Chanho Park +Copyright (c) 2017 Rhodri James +Copyright (c) 2018 Benjamin Peterson +Copyright (c) 2018 Grzegorz Antoniak (http://antoniak.org) +Copyright (c) 2018 Marco Maggi +Copyright (c) 2019 David Loffredo +Copyright (c) 2019-2020 Ben Wagner +Copyright (c) 2011, 2018 Ben Noordhuis +Copyright (c) 2018 Mariusz Zaborski +Copyright (c) 1997-2000 Thai Open Source Software Center Ltd +Copyright (c) 1999-2000 Thai Open Source Software Center Ltd +Copyright (c) 2000 2006 Erik Edelmann +Copyright (c) 2002 Greg Stein +Copyright (c) 2003 Greg Stein +Copyright (c) 2017 Alexander Bluhm +Copyright (c) 2017 Sebastian Pipping +Copyright (c) 2020 Boris Kolpackov +Copyright (c) Markus Moeller, +Copyright (c) 1993 The Regents of the University of California +Copyright (c) 2005, Aleksey Kravchenko +Copyright (c) 2007, Aleksey Kravchenko +Copyright (c) 2008, Aleksey Kravchenko +Copyright (c) 2010, Aleksey Kravchenko +Copyright (c) 2011, Aleksey Kravchenko +Copyright (c) 2013, Aleksey Kravchenko +Copyright 2007-2010 Baptiste Lepilleur and The JsonCpp Authors +Copyright 2007-2011 Baptiste Lepilleur and The JsonCpp Authors +Copyright (c) 2017 Jose Gutierrez de la Concha +Copyright (c) 2017-2018 Rhodri James +Copyright (c) Przemyslaw Skibinski, Yann Collet, Facebook, Inc. +Copyright (c) 1995-2005, 2014, 2016 Jean-loup Gailly, Mark Adler +Copyright (c) 2000 Clark Cooper +Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies) +Copyright (c) 2011 Nokia Corporation and/or its subsidiary(-ies) +Copyright (c) 2016 Cristian Rodriguez +Copyright (c) 2001-2002 Greg Stein +Copyright (c) 2016-2017 Sebastian Pipping +Copyright (c) 2016-2019 Sebastian Pipping +Copyright (c) 2016-2021 Sebastian Pipping +Copyright (c) 2016-2022 Sebastian Pipping +Copyright (c) 2017-2019 Sebastian Pipping +Copyright (c) 2017-2021 Sebastian Pipping +Copyright (c) Jacob Hoffman-Andrews, +Copyright (c) 2007-2010 Baptiste Lepilleur and The JsonCpp Authors +Copyright (c) Bill Nagel , Exacq Technologies +Copyright (c) 2007 Free Software Foundation, Inc. +Copyright (c) 2002 Fred L. Drake, Jr. +Copyright (c) 2007-2010 by Baptiste Lepilleur and The JsonCpp Authors +Portions Copyright (c) 1996-2008, PostgreSQL Global Development Group +Copyright (c) 1995-2003, 2010, 2014, 2016 Jean-loup Gailly, Mark Adler +Portions Copyright (c) 1994, The Regents of the University of California +Copyright (c) 2000-2004 Fred L. Drake, Jr. +Copyright (c) 2000-2005 Fred L. Drake, Jr. +Copyright (c) 2000-2006 Fred L. Drake, Jr. +Copyright (c) 2001-2003 Fred L. Drake, Jr. +Copyright (c) 2002-2003 Fred L. Drake, Jr. +Copyright (c) 1989, 1990, 1993 The Regents of the University of California +Copyright (c) 1998-2000 Thai Open Source Software Center Ltd and Clark Cooper +Copyright (c) 1985, 1986, 1992, 1993 The Regents of the University of California +Copyright (c) 1984, 1989-1990, 2000-2015, 2018-2021 Free Software Foundation, Inc. +Copyright (c) 1996 - 2023, Daniel Stenberg, , and many contributors +Copyright (c) 2007-2009 Scientific Computing and Imaging Institute, University of Utah +Copyright (c) 1995, 1996, 1997, 1998, 1999 Kungliga Tekniska HAPgskolan (Royal Institute of Technology, Stockholm, Sweden) + +Copyright (c) . All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + + 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + --------------------------------------------------------- --------------------------------------------------------- @@ -1086,23 +1381,23 @@ The MIT License (MIT) Copyright (c) Microsoft Corporation - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: - The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - SOFTWARE. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. --------------------------------------------------------- @@ -1118,25 +1413,25 @@ Copyright (c) NevWare21 and contributors The MIT License (MIT) -Copyright (c) Microsoft Corporation + Copyright (c) Microsoft Corporation. All rights reserved. - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: - The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - SOFTWARE. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. --------------------------------------------------------- @@ -1247,13 +1542,22 @@ SOFTWARE. @microsoft/dynamicproto-js 2.0.3 - MIT https://github.com/microsoft/DynamicProto-JS#readme -Copyright (c) 2022 Nevware21 +(c) James Halliday Copyright (c) Microsoft Corporation Copyright (c) Microsoft and contributors +Copyright (c) 2010-2013 Christian Johansen +Copyright (c) 2010-2014 Christian Johansen +Copyright (c) 2011 Sven Fuchs, Christian Johansen +Copyright Joyent, Inc. and other Node contributors +Copyright jQuery Foundation and other contributors +Copyright 2013 jQuery Foundation, Inc. and other contributors +Copyright (c) 2010-2014, Christian Johansen, christian@cjohansen.no +Copyright 2005, 2014 jQuery Foundation, Inc. and other contributors +Copyright 2006 Google Inc. https://code.google.com/p/google-diff-match-patch -The MIT License (MIT) +MIT License -Copyright (c) Microsoft Corporation + Copyright (c) Microsoft Corporation. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -1278,9 +1582,10 @@ SOFTWARE. --------------------------------------------------------- -@nevware21/ts-async 0.5.1 - MIT -https://github.com/nevware21/ts-async +@nevware21/ts-utils 0.11.2 - MIT +https://github.com/nevware21/ts-utils +Copyright (c) 2022 NevWare21 Copyright (c) 2022 Nevware21 Copyright (c) 2023 Nevware21 Copyright (c) 2024 Nevware21 @@ -1288,7 +1593,7 @@ Copyright (c) NevWare21 and contributors MIT License -Copyright (c) 2022 Nevware21 +Copyright (c) 2022 NevWare21 Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -1309,42 +1614,6 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ---------------------------------------------------------- - ---------------------------------------------------------- - -@nevware21/ts-utils 0.11.2 - MIT -https://github.com/nevware21/ts-utils - -Copyright (c) 2022 NevWare21 -Copyright (c) 2022 Nevware21 -Copyright (c) 2023 Nevware21 -Copyright (c) 2024 Nevware21 -Copyright (c) NevWare21 and contributors - -MIT License - -Copyright (c) 2022 NevWare21 - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - SOFTWARE. - - --------------------------------------------------------- --------------------------------------------------------- @@ -2321,149 +2590,6 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ---------------------------------------------------------- - ---------------------------------------------------------- - -kitware/cmake 5e984bb35232116a54de7db39788cb162ca7c263 - BSD-3 - - -CMake - Cross Platform Makefile Generator -Copyright 2000-2024 Kitware, Inc. and Contributors -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: - -* Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - -* Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - -* Neither the name of Kitware, Inc. nor the names of Contributors - may be used to endorse or promote products derived from this - software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - ------------------------------------------------------------------------------- - -The following individuals and institutions are among the Contributors: - -* Aaron C. Meadows -* Adriaan de Groot -* Aleksey Avdeev -* Alexander Neundorf -* Alexander Smorkalov -* Alexey Sokolov -* Alex Merry -* Alex Turbov -* Andreas Pakulat -* Andreas Schneider -* André Rigland Brodtkorb -* Axel Huebl, Helmholtz-Zentrum Dresden - Rossendorf -* Benjamin Eikel -* Bjoern Ricks -* Brad Hards -* Christopher Harvey -* Christoph Grüninger -* Clement Creusot -* Daniel Blezek -* Daniel Pfeifer -* Dawid Wróbel -* Enrico Scholz -* Eran Ifrah -* Esben Mose Hansen, Ange Optimization ApS -* Geoffrey Viola -* Google Inc -* Gregor Jasny -* Helio Chissini de Castro -* Ilya Lavrenov -* Insight Software Consortium -* Intel Corporation -* Jan Woetzel -* Jordan Williams -* Julien Schueller -* Kelly Thompson -* Konstantin Podsvirov -* Laurent Montel -* Mario Bensi -* Martin Gräßlin -* Mathieu Malaterre -* Matthaeus G. Chajdas -* Matthias Kretz -* Matthias Maennich -* Michael Hirsch, Ph.D. -* Michael Stürmer -* Miguel A. Figueroa-Villanueva -* Mike Durso -* Mike Jackson -* Mike McQuaid -* Nicolas Bock -* Nicolas Despres -* Nikita Krupen'ko -* NVIDIA Corporation -* OpenGamma Ltd. -* Patrick Stotko -* Per Øyvind Karlsen -* Peter Collingbourne -* Petr Gotthard -* Philip Lowman -* Philippe Proulx -* Raffi Enficiaud, Max Planck Society -* Raumfeld -* Roger Leigh -* Rolf Eike Beer -* Roman Donchenko -* Roman Kharitonov -* Ruslan Baratov -* Sebastian Holtermann -* Stephen Kelly -* Sylvain Joubert -* The Qt Company Ltd. -* Thomas Sondergaard -* Tobias Hunger -* Todd Gamblin -* Tristan Carel -* University of Dundee -* Vadim Zhukov -* Will Dicharry - -See version control history for details of individual contributions. - -The above copyright and license notice applies to distributions of -CMake in source and binary form. Third-party software packages supplied -with CMake under compatible licenses provide their own copyright notices -documented in corresponding subdirectories or source files. - ------------------------------------------------------------------------------- - -CMake was initially developed by Kitware with the following sponsorship: - - * National Library of Medicine at the National Institutes of Health - as part of the Insight Segmentation and Registration Toolkit (ITK). - - * US National Labs (Los Alamos, Livermore, Sandia) ASC Parallel - Visualization Initiative. - - * National Alliance for Medical Image Computing (NAMIC) is funded by the - National Institutes of Health through the NIH Roadmap for Medical Research, - Grant U54 EB005149. - - * Kitware, Inc. --------------------------------------------------------- diff --git a/docs/cmake-options-configuration.md b/docs/cmake-options-configuration.md index b0e0e1bba..3d8b195d5 100644 --- a/docs/cmake-options-configuration.md +++ b/docs/cmake-options-configuration.md @@ -142,8 +142,8 @@ The full level of options for the CMake status can be seen below: * `folder` is the active folder in your workspace. This is where the project is scoped to. * `configure` is associated with the CMake Configure action. It can only be found in the Project Status View and can't be seen in the status bar, hence no `statusBarVisibility` property value. * `configurePreset` is associated with the CMake Configure Preset. When selected, the user can modify their active CMake Configure Preset from the list detected in their CMakePresets.json and CMakeUserPresets.json (if found in project). -* `kit` is associated with the active kit selected (when CMake Presets aren't present). When selected, the user can modify their active kit. To learn more about kits, please see [our kit documentation](https://github.com/microsoft/vscode-cmake-tools/docs/kits.md). -* `variant` is associated with the active variant (when CMake Presets aren't present). When selected, the user can modify their active variant. Variant status does not show on the Project Status View, but will show in the status bar when set to `visible`. To learn more about variants, please see [our variant documentation](https://github.com/microsoft/vscode-cmake-tools/docs/variants.md). +* `kit` is associated with the active kit selected (when CMake Presets aren't present). When selected, the user can modify their active kit. To learn more about kits, please see [our kit documentation](kits.md). +* `variant` is associated with the active variant (when CMake Presets aren't present). When selected, the user can modify their active variant. Variant status does not show on the Project Status View, but will show in the status bar when set to `visible`. To learn more about variants, please see [our variant documentation](variants.md). * `build` is associated with the CMake Build action. It invokes a CMake build on your build target using your build preset or variant. * `buildPreset` is associated with your active CMake Build Preset. When selected, the user can modify their active CMake Build Preset from the list detected in their CMakePresets.json and CMakeUserPresets.json (if found in project). * `buildTarget` is associated with your active CMake Build Target. When selected, the user can specify their active Build Target. This will be the target invoked when the user presses the `Build` icon in the status bar (if not hidden) or runs `CMake: Build Target` from the Command Palette. diff --git a/docs/cmake-presets.md b/docs/cmake-presets.md index 3e645d4ff..cd6179c2d 100644 --- a/docs/cmake-presets.md +++ b/docs/cmake-presets.md @@ -212,13 +212,13 @@ Set the path to `vcpkg.cmake` with the `VCPKG_ROOT` environment variable in `CMa }, ``` -`VCPKG_ROOT` should be set to the root of your vcpkg installation. For more information, see [vcpkg environment variables](https://github.com/microsoft/vcpkg/blob/master/docs/users/config-environment.md). +`VCPKG_ROOT` should be set to the root of your vcpkg installation. For more information, see [vcpkg environment variables](https://learn.microsoft.com/en-us/vcpkg/users/config-environment#vcpkg_root). -If you're already using a CMake toolchain file and want to enable vcpkg integration, see [Using multiple toolchain files](https://github.com/microsoft/vcpkg/blob/master/docs/users/integration.md#using-multiple-toolchain-files). Follow those instructions to use an external toolchain file with a project by using vcpkg. +If you're already using a CMake toolchain file and want to enable vcpkg integration, see [Using multiple toolchain files](https://learn.microsoft.com/en-us/vcpkg/users/buildsystems/cmake-integration#using-multiple-toolchain-files). Follow those instructions to use an external toolchain file with a project by using vcpkg. ## Substitute commands in `launch.json` and `settings.json` -CMake Tools supports command substitution for launch commands when `CMakePresets.json` integration is enabled. For more information, see [Command substitution](https://github.com/microsoft/vscode-cmake-tools/blob/main/docs/cmake-settings.md#command-substitution). +CMake Tools supports command substitution for launch commands when `CMakePresets.json` integration is enabled. For more information, see [Command substitution](cmake-settings.md#command-substitution). ## Ignored settings diff --git a/docs/cmake-settings.md b/docs/cmake-settings.md index c5cc3793c..e6b625833 100644 --- a/docs/cmake-settings.md +++ b/docs/cmake-settings.md @@ -26,7 +26,7 @@ Options that support substitution, in the table below, allow variable references | `cmake.copyCompileCommands`| If not `null`, copies the `compile_commands.json` file generated by CMake to the path specified by this setting whenever CMake successfully configures. | `null` (do not copy the file) | yes | | `cmake.debugConfig`| The debug configuration to use when debugging a target | `null` (no values) | yes | | `cmake.defaultVariants` | Override the default set of variants that will be supplied when no variants file is present. See [CMake variants](variants.md). | | no | -| `cmake.environment` | An object containing `key:value` pairs of environment variables, which will be available when configuring, building, debugging, running or testing with CTest. | `null` (no environment variables) | yes | +| `cmake.environment` | An object containing `key:value` pairs of environment variables, which will be available when configuring, building, or testing with CTest. | `null` (no environment variables) | yes | | `cmake.generator` | Set to a string to override CMake Tools preferred generator logic. If set, CMake will unconditionally use it as the `-G` CMake generator command line argument. ||no| | `cmake.installPrefix` | If specified, sets a value for `CMAKE_INSTALL_PREFIX` when running CMake configure. If not set, no value will be passed.
If `CMAKE_INSTALL_PREFIX` is set via `cmake.configureArgs` or `cmake.configureSettings`, `cmake.installPrefix` will be ignored.| `null` (no value specified) | yes | | `cmake.loggingLevel` | A string setting that specifies how much output CMake Tools produces in its output channel. Set to one of `"trace"`, `"debug"`, `"info"`, `"note"`, `"warning"`, `"error"`, or `"fatal"`. `"trace"` is the most verbose.

Regardless of the logging level, CMake Tools writes all levels of logging to the CMake Tools log file. This file is useful if you need to [troubleshoot CMake Tools](troubleshoot.md) | `"info"` | no | diff --git a/docs/configure.md b/docs/configure.md index c947650b1..8f74f3ac9 100644 --- a/docs/configure.md +++ b/docs/configure.md @@ -61,7 +61,7 @@ When CMake Tools runs the configure step, it takes the following into considerat 4. `CMAKE_BUILD_TYPE` is set based on [variant options](variants.md#variants-options). 5. `CMAKE_INSTALL_PREFIX` is set based on [cmake.installPrefix](cmake-settings.md#cmake-settings). 6. `CMAKE_TOOLCHAIN_FILE` is set for [toolchain](kits.md#specify-a-toolchain). - 7. The [cmakeSettings](kits.md#generic-options) attribute on the active kit. + 7. The [cmakeSettings](kits.md#general-options) attribute on the active kit. Additionally, [cmake.configureArgs](cmake-settings.md#cmake-settings) are passed before any of the above. @@ -89,7 +89,7 @@ To get CMake Tools to do a clean configure, run **CMake: Delete Cache and Reconf A clean configure deletes the `CMakeCache.txt` file and `CMakeFiles` directory from the build directory. This resets all of CMake's default state. -A clean configure is required for certain build system changes, such as when the active kit changes, but may als be convenient as a reset if you have changed configuration settings outside of CMake Tools. +A clean configure is required for certain build system changes, such as when the active kit changes, but may also be convenient as a reset if you have changed configuration settings outside of CMake Tools. CMake Tools will do a clean configure automatically if you change the active kit. diff --git a/docs/debug-launch.md b/docs/debug-launch.md index 7bb7e1458..130c69474 100644 --- a/docs/debug-launch.md +++ b/docs/debug-launch.md @@ -32,7 +32,7 @@ CMake Tools lets you start a debugger on a target without creating a `launch.jso > **Note:** > Only the debugger from Microsoft's `vscode-ms-vscode.cpptools` extension supports quick-debugging. See [Debug using a launch.json file](#debug-using-a-launchjson-file), below, for information about `launch.json` and using other debuggers. -Start a debugging session on the active target by running the *CMake: Debug* command from the VS Code command palette, by selecting the Debug button in the status bar or CMake Tools sidebar Project Status View, or by pressing the keyboard shortcut (the default is **Ctrl+F5**). +Start a debugging session on the active target by running the *CMake: Debug* command from the VS Code command palette, by selecting the Debug button in the status bar or CMake Tools sidebar Project Status View, or by pressing the keyboard shortcut (the default is **Shift+F5**). ![Image of launching the debugger for the selected target](images/debug-targetv2.png) @@ -43,7 +43,7 @@ Start a debugging session on the active target by running the *CMake: Debug* com You can specify the working directory or command line arguments for debugging, or use another debugger than the one included with Microsoft's `vscode-ms-vscode.cpptools`, by creating a `launch.json` file. -You'll need to know the path to the executable binary, which may be difficult to know in advance. CMake Tools can help by using [command substitution](https://github.com/microsoft/vscode-cmake-tools/blob/main/docs/cmake-settings.md#command-substitution) in the `launch.json` file. This is already used by things like process selection when attaching to a running process. It works by specifying a command-based substitution in the appropriate field of `launch.json`. +You'll need to know the path to the executable binary, which may be difficult to know in advance. CMake Tools can help by using [command substitution](cmake-settings.md#command-substitution) in the `launch.json` file. This is already used by things like process selection when attaching to a running process. It works by specifying a command-based substitution in the appropriate field of `launch.json`. Here are minimal examples of a `launch.json` file that uses `cmake.launchTargetPath` and `cmake.getLaunchTargetDirectory` to start a debugger on the active launch target: @@ -229,7 +229,7 @@ Depending on your configuration or your settings, there may need to be additiona ## Run without debugging -You can run a target without debugging it, by running the *CMake: Run Without Debugging* from VS Code's command palette, by selecting the play button in the status bar or the play button to the left of the Launch node, or by pressing the keyboard shortcut (the default `Shift+F5`). +You can run a target without debugging it, by running the *CMake: Run Without Debugging* from VS Code's command palette, by selecting the play button in the status bar or the play button to the left of the Launch node, or by pressing the keyboard shortcut (the default **Ctrl+F5**). ![Image of launching the selected target in the terminal window](images/launch-target.png) diff --git a/docs/faq.md b/docs/faq.md index 3dc8fb3e8..bcf723234 100644 --- a/docs/faq.md +++ b/docs/faq.md @@ -6,7 +6,7 @@ Please visit [the end-user support chat](https://gitter.im/vscode-cmake-tools/su Also look in the [Troubleshooting guide](troubleshoot.md). -Check the [CMake Tools issue tracker](https://github.com/vector-of-bool/vscode-cmake-tools/issues) and [What's New](https://github.com/microsoft/vscode-cmake-tools/blob/main/CHANGELOG.md) to see if your issue is already known/solved before submitting a question or bug report. Feel free to [Open a Github issue](https://github.com/microsoft/vscode-cmake-tools/issues) if your problem hasn't been reported. +Check the [CMake Tools issue tracker](https://github.com/microsoft/vscode-cmake-tools/issues) and [What's New](../CHANGELOG.md) to see if your issue is already known/solved before submitting a question or bug report. Feel free to [Open a Github issue](https://github.com/microsoft/vscode-cmake-tools/issues) if your problem hasn't been reported. Explore the [CMake Tools documentation](README.md) diff --git a/docs/troubleshoot.md b/docs/troubleshoot.md index bf25a0f8b..8f979528c 100644 --- a/docs/troubleshoot.md +++ b/docs/troubleshoot.md @@ -40,6 +40,6 @@ This file is user-local, not workspace-local. This file includes all log entries ## Get help -Check the [CMake Tools issue tracker](https://github.com/vector-of-bool/vscode-cmake-tools/issues) and [What's New](https://github.com/microsoft/vscode-cmake-tools/blob/main/CHANGELOG.md) to see if your issue is already known/solved before submitting a question or bug report. Feel free to open an issue if your problem hasn't been reported. +Check the [CMake Tools issue tracker](https://github.com/microsoft/vscode-cmake-tools/issues) and [What's New](../CHANGELOG.md) to see if your issue is already known/solved before submitting a question or bug report. Feel free to open an issue if your problem hasn't been reported. Please visit [the support chat](https://gitter.im/vscode-cmake-tools/support). This is a community chat. Microsoft does not monitor it. \ No newline at end of file diff --git a/docs/variants.md b/docs/variants.md index 3a01093ff..8df69c472 100644 --- a/docs/variants.md +++ b/docs/variants.md @@ -6,16 +6,17 @@ The main way to create a variant is via a `cmake-variants.json` or `cmake-varian Variants are a different concept than toolchains or toolsets. Those are handled by [CMake kits](kits.md). -By default, if a variants file isn't present, CMake Tools loads four variants that correspond to default CMake build types: **Release**, **Debug**, **MinSizeRel**, and **RelWithDebInfo**. These variants do the following: +By default, if a variants file isn't present, CMake Tools loads five options. Four options are variants that correspond to the default CMake build types: **Release**, **Debug**, **MinSizeRel**, and **RelWithDebInfo**. One **Unspecified** option lets CMake select the build type itself. The options do the following: -|Option | Description | +| Option | Description | |---------|---------| -|`Debug` | Disables optimizations and includes debug info.| -|`Release`| Includes optimizations but no debug info.| -|`MinSizeRel`| Optimizes for size. No debug info.| -|`RelWithDebInfo` | Optimizes for speed but also includes debug info. | +| `Debug` | Variant - Disables optimizations and includes debug info. | +| `Release` | Variant - Includes optimizations but no debug info. | +| `MinSizeRel` | Variant - Optimizes for size. No debug info. | +| `RelWithDebInfo` | Variant - Optimizes for speed but also includes debug info. | +| `Unspecified` | Lets CMake select a default build type. | -Selecting one of these variants configures and builds using the corresponding build type. +Selecting one of the variants configures and builds using the corresponding build type. > **Important:** > CMake Tools does not respect `CMAKE_CONFIGURATION_TYPES`. Only the default configuration types listed above are present. A custom variant file is required to load other build types. diff --git a/i18n/chs/package.i18n.json b/i18n/chs/package.i18n.json index 1498a341c..7cf328f24 100644 --- a/i18n/chs/package.i18n.json +++ b/i18n/chs/package.i18n.json @@ -69,7 +69,7 @@ "cmake-tools.command.cmake.debugTargetAll.title": "调试所有项目", "cmake-tools.command.cmake.launchTarget.title": "运行但不调试", "cmake-tools.command.cmake.launchTargetAll.title": "运行所有项目但不调试", - "cmake-tools.command.cmake.selectLaunchTarget.title": "设置调试目标", + "cmake-tools.command.cmake.selectLaunchTarget.title": "设置启动/调试目标", "cmake-tools.command.cmake.stop.title": "取消生成", "cmake-tools.command.cmake.stopAll.title": "取消所有项目的生成", "cmake-tools.command.cmake.resetState.title": "重置 CMake Tools 扩展状态(用于故障排除)", @@ -108,6 +108,7 @@ "cmake-tools.configuration.cmake.ctest.parallelJobs.markdownDescription": "并行测试作业的数量。使用零可以使用 `#cmake.parallelJobs#` 的值。这仅适用于 `#cmake.ctest.allowParallelJobs#` 设置为 `true` 的情况。", "cmake-tools.configuration.cmake.ctest.allowParallelJobs.description": "允许并行运行 ctest,但结果输出可能会因此而乱码,并且测试资源管理器可能无法准确地反映测试进度。", "cmake-tools.configuration.cmake.ctest.testExplorerIntegrationEnabled.description": "是否启用与测试资源管理器的集成。如果希望使用其他扩展进行测试集成,这有助于禁用。", + "cmake-tools.configuration.cmake.ctest.testSuiteDelimiter.markdownDescription": "可选分隔符,用于在测试资源管理器中以分层方式分隔测试套件名称和组合测试。此字符串用于正则表达式,因此某些分隔符可能需要转义。示例: `-` (一个分隔符: `-`),`\\.|::` (两个分隔符: `.` 或 `::`。请注意,需要对 `.` 进行转义。)", "cmake-tools.configuration.cmake.parseBuildDiagnostics.description": "分析编译器输出以查找警告和错误。", "cmake-tools.configuration.cmake.enabledOutputParsers.description": "要使用的输出分析程序。支持的分析程序 `cmake`、`gcc`、`gnuld`(适用于 GNULD 样式的 inker 输出)、`msvc`(适用于 Microsoft Visual C++)、`ghs`(适用于 Green Hills 编译器,具有 --no_wrap_diagnostics --brief_diagnostics),以及 `diab`(适用于 Wind River Diab 编译器)。", "cmake-tools.configuration.cmake.debugConfig.description": "要在调试目标时使用的调试配置。", @@ -132,6 +133,7 @@ "cmake-tools.configuration.cmake.debugConfig.setupCommands.description.description": "命令的说明。", "cmake-tools.configuration.cmake.defaultVariants.overall.description": "配置默认变量设置。", "cmake-tools.configuration.cmake.defaultVariants.buildType.description": "生成类型。", + "cmake-tools.configuration.cmake.defaultVariants.buildType.unspecified.long": "让 CMake 选择默认生成类型。", "cmake-tools.configuration.cmake.defaultVariants.buildType.debug.long": "禁用优化 - 包括调试信息。", "cmake-tools.configuration.cmake.defaultVariants.buildType.release.long": "进行优化,提高速度 - 排除调试信息。", "cmake-tools.configuration.cmake.defaultVariants.buildType.minsize.long": "优化最小二进制大小 - 排除调试信息。", @@ -153,6 +155,7 @@ "cmake-tools.configuration.cmake.copyCompileCommands.description": "成功配置后将 compile_commands.json 复制到此位置。", "cmake-tools.configuration.cmake.configureOnOpen.description": "在 CMake 项目目录打开时自动对其进行配置。", "cmake-tools.configuration.cmake.configureOnEdit.description": "保存 cmake.sourceDirectory 或 CMakeLists.txt 内容时,自动配置 CMake 项目目录。", + "cmake-tools.configuration.cmake.deleteBuildDirOnCleanConfigure.description": "调用干净配置时删除整个编译目录。", "cmake-tools.configuration.cmake.setBuildTypeOnMultiConfig.description": "在多配置生成器上也设置 CMAKE_BUILD_TYPE。", "cmake-tools.configuration.cmake.skipConfigureIfCachePresent.description": "如果存在缓存,则跳过配置进程。", "cmake-tools.configuration.cmake.cmakeCommunicationMode": "用于在扩展和 CMake 之间进行通信的协议。", @@ -196,8 +199,10 @@ "cmake-tools.configuration.cmake.revealLog.focus.description": "将显示日志,并且输出通道会占用光标焦点。", "cmake-tools.configuration.cmake.revealLog.always.description": "将显示日志,但输出通道不会占用光标焦点。", "cmake-tools.configuration.cmake.revealLog.never.description": "日志既不显示也不占据焦点。", + "cmake-tools.configuration.cmake.revealLog.onError.description": "仅当生成或配置失败时,才会显示日志。", "cmake-tools.configuration.cmake.exportCompileCommandsFile.description": "支持导出 compile_commands.json。仅在工具包场景中使用。在预设场景中,请使用 CMakePresets.json 设置它", "cmake-tools.configuration.cmake.useCMakePresets.description": "使用 CMakePresets.json 配置驱动器 CMake 配置、生成和测试。使用 CMakePresets.json 时,将忽略工具包、变量和 settings.json 中的某些设置。", + "cmake-tools.configuration.cmake.useVsDeveloperEnvironment.description": "在 Windows 上使用 CMake 预设时,请使用 Visual Studio 环境作为父环境。选择“自动”将仅在检测到受支持的编译器(cl、clang、clang-cl、clang-cpp、clang++)或正在使用 Ninja 生成器时应用 Visual Studio 环境。", "cmake-tools.configuration.cmake.allowCommentsInPresetsFile.description": "允许使用 JSON 扩展,如 CMakePresets.json 中的注释。请注意,如果使用非标准 JSON,则其他 IDE 或命令行可能认为 CMakePresets.json 文件无效。", "cmake-tools.configuration.cmake.allowUnsupportedPresetsVersions.description": "支持使用预设文件,这些文件使用的是 CMake Tools 扩展当前不支持的版本中的功能。将忽略未知属性和宏。", "cmake-tools.configuration.cmake.ignoreCMakeListsMissing.description": "如果为 `true`,则当在工作区中找到 CMakeLists.txt 文件,但未在根文件夹中找到时,扩展将不会要求用户选择 CMakeLists.txt 文件以进行配置。", diff --git a/i18n/chs/src/cmake/cmakeExecutable.i18n.json b/i18n/chs/src/cmake/cmakeExecutable.i18n.json new file mode 100644 index 000000000..21ed14eba --- /dev/null +++ b/i18n/chs/src/cmake/cmakeExecutable.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "cmake.exe.not.found.in.cache": "在缓存中找不到 CMake 可执行文件。正在重新检查。" +} \ No newline at end of file diff --git a/i18n/chs/src/cmakeProject.i18n.json b/i18n/chs/src/cmakeProject.i18n.json index dca337773..bbfdebcb8 100644 --- a/i18n/chs/src/cmakeProject.i18n.json +++ b/i18n/chs/src/cmakeProject.i18n.json @@ -101,6 +101,7 @@ "options.configureWithDebuggerOnFail.do.not.show": "不再显示", "configure.failed.tryWithDebugger": "配置失败。是否要尝试使用 CMake 调试程序进行配置?", "no.configureWithDebugger.button": "取消", + "cmake.debug.name": "CMake 调试程序", "finishing.configure": "正在完成配置", "configure.failed": "未能配置项目", "saving.open.files.before": "在配置/生成前保存打开的文件", diff --git a/i18n/chs/src/ctest.i18n.json b/i18n/chs/src/ctest.i18n.json index ac28d5b58..510af931c 100644 --- a/i18n/chs/src/ctest.i18n.json +++ b/i18n/chs/src/ctest.i18n.json @@ -9,10 +9,10 @@ "no.project.found": "找不到文件夹的项目 {0}", "no.driver.found": "找不到文件夹 {0} 的驱动程序", "ctest.args.not.found": "无法获取测试参数", + "test.results.not.found": "找不到测试结果。", "test.failed.with.exit.code": "测试{0}失败,退出代码 {1}。", "test.failed.with.completion.status": "测试{0}失败,完成状态为 \"{1}\"。", "test.failed": "测试{0}失败。有关详细信息,请检查输出。", - "test.results.not.found": "找不到测试结果。", "ctest.run.terminated": "CTest 运行已终止", "ctest.finished.with.code": "CTest 已完成,返回代码 {0}", "folder.not.found.in.test.explorer": "在测试资源管理器中找不到文件夹: {0}", diff --git a/i18n/chs/src/drivers/cmakeFileApiDriver.i18n.json b/i18n/chs/src/drivers/cmakeFileApiDriver.i18n.json index eecb8e488..c49fdeac1 100644 --- a/i18n/chs/src/drivers/cmakeFileApiDriver.i18n.json +++ b/i18n/chs/src/drivers/cmakeFileApiDriver.i18n.json @@ -7,7 +7,6 @@ "creating.instance.of": "正在创建 {0} 的实例", "removing": "正在删除 {0}", "unlink.failed": "未能删除缓存文件 {0}", - "cmake.debug.name": "CMake 调试程序", "toolchains.object.unsupported": "此版本的 CMake 不支持 \"toolchains\" 对象类型。编译器路径将通过读取 CMakeCache.txt 来确定。", "build.all.target": "用于生成所有可用目标的特殊目标", "cmake.install.name": "安装" diff --git a/i18n/chs/src/expand.i18n.json b/i18n/chs/src/expand.i18n.json index 5696836ca..496e88b96 100644 --- a/i18n/chs/src/expand.i18n.json +++ b/i18n/chs/src/expand.i18n.json @@ -4,11 +4,16 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "circular.variable.reference": "已找到循环变量引用: {0}", + "circular.variable.reference.full": "已找到循环变量引用: {0}", "reached.max.recursion": "已达到最大字符串扩展递归。可能存在循环引用。", - "exception.expanding.string": "展开字符串 {0} 时出现异常: {1}", - "invalid.variable.reference": "字符串中的变量引用 {0} 无效: {1}", + "max.recursion": "最大字符串扩展递归", + "exception.expanding.string.full": "展开字符串 {0} 时出现异常: {1}", + "exception.expanding.string": "异常展开字符串", + "invalid.variable.reference.full": "字符串中的变量引用 {0} 无效: {1}", + "invalid.variable.reference": "变量引用无效", + "circular.variable.reference": "循环变量引用", "command.not.supported": "命令不支持字符串: {0}", - "exception.executing.command": "对字符串执行命令 {0} 时出现异常: {1} {2}", + "exception.executing.command.full": "对字符串执行命令 {0} 时出现异常: {1} {2}", + "exception.executing.command": "异常执行命令", "expand.expandstringhelper": "已展开 {0}" } \ No newline at end of file diff --git a/i18n/chs/src/extension.i18n.json b/i18n/chs/src/extension.i18n.json index 974dc9363..679ac9b69 100644 --- a/i18n/chs/src/extension.i18n.json +++ b/i18n/chs/src/extension.i18n.json @@ -6,15 +6,6 @@ { "rereading.kits": "重新读取工具包", "dispose.cmake.tools": "释放 CMake 工具", - "configure.this.project": "是否要配置项目 {0}?", - "yes.button": "是", - "not.now.button": "暂不处理", - "always.configure.on.open": "始终在打开时配置项目?", - "never.configure.on.open": "打开时配置项目?", - "no.button": "否", - "never.button": "从不", - "never.for.this.workspace.button": "不是此工作区", - "persist.config.on.open.setting": "保留“打开即配置”设置", "configuring.workspace.on.open": "正在打开的 {0} 上配置工作区", "configure.now.button": "立即配置", "configure.recommended": "建议在升级到新的工具包定义后重新配置。", @@ -35,6 +26,7 @@ "skip.set.workflow.preset": "使用工具包,跳过设置工作流预设: {0}", "no.active.cmake.project": "没有活动的 CMake 项目。", "invalid.folder": "无效的文件夹。", + "cmake.debug.name": "CMake 调试程序", "select.a.cmake.project": "选择 cmake 项目", "compilation information.not.found": "找不到此文件的编译信息", "add.config.preset.in.test.mode": "正在测试模式下运行 CMakeTools。已禁用 addConfigurePreset。", diff --git a/i18n/chs/src/preset.i18n.json b/i18n/chs/src/preset.i18n.json index 5bf700d1a..e0bd0fdeb 100644 --- a/i18n/chs/src/preset.i18n.json +++ b/i18n/chs/src/preset.i18n.json @@ -18,25 +18,30 @@ "default.workflow.preset": "[默认值]", "default.workflow.preset.description": "不添加任何参数的空工作流预设", "circular.inherits.in.config.preset": "配置预设 {0} 中的循环继承", - "binaryDir.undefined": "配置预设 {0}: 未指定 binaryDir,使用默认值 {1}", - "no.cl.arch": "配置预设 {0}: 没有为 cl.exe 指定体系结构,默认情况下使用 x86", + "no.cl.arch": "配置预设 {0}: 未为 cl.exe 指定体系结构,默认使用 {1}", "no.cl.toolset.arch": "配置预设{0}: 未为 cl.exe 指定工具集体系结构,默认使用 {1}", "invalid.cl.toolset.arch": "配置预设{0}: 非预期的工具集体系结构指定了 {1},是否要指定 {2}?", "no.cl.toolset.version": "配置预设 {0}: 没有为 cl.exe 指定工具集版本,默认情况下使用最新版本", "unknown.toolset.option": "将忽略未识别的工具集选项: {0}", - "config.preset.not.found": "找不到名为 {0} 的配置预设", "specified.vs.not.found": "配置预设 {0}: 未找到由 {1} 指定的 Visual Studio 实例,正在回退默认实例查找行为。", "specified.cl.not.found": "配置预设 {0}: 未找到具有工具集 {2} 和体系结构 {3} 的编译器 {1},如果计算机上存在此工具集,则可能需要运行“CMake: 扫描编译器”命令。", + "vs.not.found": "配置预设 {0}: 找不到支持指定工具集 {1} 和体系结构 {2} 的 Visual Studio 安装,如果计算机上存在此工具集,则可能需要运行“CMake: 扫描编译器”命令。", "using.vs.instance": "使用来自 Visual Studio 的开发人员环境(实例 {0},版本 {1},安装在 {2})", "ninja.not.set": "未在 PATH 上设置 Ninja,正在尝试使用 {0}", + "config.preset.not.found.full": "找不到名为 {0} 的配置预设", + "config.preset.not.found": "找不到配置预设", "property.unsupported.v2": "配置预设 {0}: 预设 v2 中不支持属性 {1}", + "binaryDir.undefined": "配置预设 {0}: 未指定 binaryDir,使用默认值 {1}", "circular.inherits.in.build.preset": "生成预设 {0} 中的循环继承", "circular.inherits.in.test.preset": "测试预设 {0} 中的循环继承", "circular.inherits.in.package.preset": "循环在包预设 {0} 中继承", "circular.inherits.in.workflow.preset": "循环在工作流预设 {0} 中继承", - "build.preset.not.found": "找不到名称为 {0} 的生成预设", - "test.preset.not.found": "找不到名称为 {0} 的测试预设", - "package.preset.not.found": "找不名称为 {0} 的包预设", + "build.preset.not.found.full": "找不到名称为 {0} 的生成预设", + "build.preset.not.found": "找不到生成预设", + "test.preset.not.found.full": "找不到名称为 {0} 的测试预设", + "test.preset.not.found": "找不到测试预设", + "package.preset.not.found.full": "找不名称为 {0} 的包预设", + "package.preset.not.found": "找不到包预设", "workflow.preset.not.found": "找不到名为 {0} 的工作流预设", "clean.not.needed.no.prior.config.preset": "无需清理: 未选择任何之前的配置预设", "clean.needed.config.preset.changed": "需要清理: 配置预设已更改" diff --git a/i18n/chs/src/presetsController.i18n.json b/i18n/chs/src/presetsController.i18n.json index bafe9709d..903a7af20 100644 --- a/i18n/chs/src/presetsController.i18n.json +++ b/i18n/chs/src/presetsController.i18n.json @@ -25,6 +25,9 @@ "user.cancelled.compiler.selection": "用户已取消编译器选择", "user.selected.compiler": "用户已选择编译器 {0}", "select.one.or.more.config.preset.placeholder": "选择一个或多个配置预设", + "custom.configure.preset.toolchain.file": "使用工具链文件配置预设", + "description.custom.configure.preset": "设置 Ninja 生成器、版本和安装目录", + "custom.configure.preset": "自定义配置预设", "user.selected.config.preset": "用户已选择配置预设 {0}", "yes": "是", "no": "否", @@ -112,8 +115,12 @@ "reading.presets.file": "正在读取预设文件 {0}", "failed.to.parse": "无法分析 {0}: {1}", "included.presets.file.not.found": "找不到包含的预设文件 {0}", + "expanding.presets.file": "正在展开预设文件 {0}", + "expansion.errors": "预设文件中发现扩展错误。", + "successfully.expanded.presets.file": "已成功展开预设文件 {0}", "validating.presets.file": "读取并验证预设“文件 {0}”", "unsupported.presets": "在 {0} 中检测到不受支持的预设。支持仅限于版本 {1} 定义的功能。", + "no.additional.properties": "不得具有其他属性", "unsupported.presets.disable": "通过使用 {0} 设置可以忽略未知属性和宏。", "duplicate.build.preset.found": "在生成预设集合 {0} 中找到重复项", "duplicate.test.preset.found": "在测试预设集合 {0} 中找到重复项", @@ -121,9 +128,10 @@ "duplicate.workflow.preset.found": "在工作流预设集合 {0} 中找到重复项", "workflow.does.not.start.configure.step": "工作流预设“{0}”不以配置步骤开始。", "workflow.has.subsequent.configure.preset": "工作流预设“{0}”除了第一步“{2}”之外还有另一个配置预设“{1}”: ", - "successfully.validated.presets": "已在 {0} 中成功验证预设值", + "successfully.validated.presets": "已成功针对预设架构验证 {0}", "use.kits.variants": "使用工具包和变量", "edit.presets": "定位", "presets.version.error": "CMakePresets 版本 1 不受支持。希望如何继续?", - "failed.writing.to.file": "未能写入文件 {0}" + "failed.writing.to.file": "未能写入文件 {0}", + "failed.to.watch": "无法为 {0} 创建观察程序: {1}" } \ No newline at end of file diff --git a/i18n/chs/src/projectStatus.i18n.json b/i18n/chs/src/projectStatus.i18n.json index e1faaff4b..9ce5b21d7 100644 --- a/i18n/chs/src/projectStatus.i18n.json +++ b/i18n/chs/src/projectStatus.i18n.json @@ -24,8 +24,16 @@ "Launch": "启动", "Folder": "文件夹", "active.folder": "活动文件夹", + "configPreset.change": "更改配置预设", + "override.settings.applied": "已应用替代设置", + "buildPreset.change": "更改生成预设", + "testPreset.change": "更改测试预设", + "packagePreset.change": "更改包预设", + "workflowPreset.change": "更改工作流预设", + "kit.change": "更改工具包", "set.build.target": "设置生成目标", "set.debug.target": "设置调试目标", "set.launch.target": "设置启动目标", - "select.active.folder": "选择活动文件夹" + "select.active.folder": "选择活动文件夹", + "set.variant": "设置变体" } \ No newline at end of file diff --git a/i18n/chs/src/variant.i18n.json b/i18n/chs/src/variant.i18n.json index 6a50b1c37..e30bd43ce 100644 --- a/i18n/chs/src/variant.i18n.json +++ b/i18n/chs/src/variant.i18n.json @@ -9,6 +9,7 @@ "enable.optimizations.omit.debug": "启用优化,省略调试信息", "optimize.for.smallest": "针对最小的二进制大小进行优化", "optimize.and.debug": "执行优化并包括调试信息", + "unspec.build.type": "让 CMake 选择默认生成类型", "constructing": "构造 {0}", "reloading.variants.file": "正在重新加载变量文件 {0}", "reloading.variants.from.settings": "正在从设置重新加载变量", diff --git a/i18n/cht/package.i18n.json b/i18n/cht/package.i18n.json index 8a6064d53..b51a24eda 100644 --- a/i18n/cht/package.i18n.json +++ b/i18n/cht/package.i18n.json @@ -69,7 +69,7 @@ "cmake-tools.command.cmake.debugTargetAll.title": "偵錯所有專案", "cmake-tools.command.cmake.launchTarget.title": "執行但不進行偵錯", "cmake-tools.command.cmake.launchTargetAll.title": "執行所有專案但不進行偵錯", - "cmake-tools.command.cmake.selectLaunchTarget.title": "設定偵錯目標", + "cmake-tools.command.cmake.selectLaunchTarget.title": "設定啟動/偵錯目標", "cmake-tools.command.cmake.stop.title": "取消建置", "cmake-tools.command.cmake.stopAll.title": "取消所有專案的組建", "cmake-tools.command.cmake.resetState.title": "重設 CMake 工具延伸模組狀態 (進行疑難排解)", @@ -108,6 +108,7 @@ "cmake-tools.configuration.cmake.ctest.parallelJobs.markdownDescription": "平行測試工作的數量。使用零以使用 `#cmake.parallelJobs#` 的值。這僅適用於 `#cmake.ctest.allowParallelJobs#` 設定為 `true` 的情况。", "cmake-tools.configuration.cmake.ctest.allowParallelJobs.description": "允許 ctest 平行執行,但結果輸出可能因此而出現亂碼,且測試總管可能無法精確反映測試進度。", "cmake-tools.configuration.cmake.ctest.testExplorerIntegrationEnabled.description": "是否已啟用與測試總管的整合。如果您偏好使用不同的延伸模組進行測試整合,這有助於停用。", + "cmake-tools.configuration.cmake.ctest.testSuiteDelimiter.markdownDescription": "選擇性分隔符號,用來在測試總管中以階層方式分隔測試套件名稱和群組測試。此字串用於規則運算式,因此某些分隔符號可能需要逸出。範例:`-` (一個分隔符號:`-`)、`\\.|::` (兩個分隔符號:`.` 或 `::`。請注意,`.` 必須逸出。)", "cmake-tools.configuration.cmake.parseBuildDiagnostics.description": "剖析警告與錯誤的編譯器輸出。", "cmake-tools.configuration.cmake.enabledOutputParsers.description": "要使用的輸出剖析器。支援的剖析器為 `cmake`、`gcc`、`gnuld` (若為 GNULD 樣式的連結器輸出)、`msvc` (若為 Microsoft Visual C++)、`ghs` (若為具有 --no_wrap_diagnostics --brief_diagnostics 的 Green Hills 編譯器) 及 `diab` (若為 Wind River Diab 編譯器)。", "cmake-tools.configuration.cmake.debugConfig.description": "偵錯目標時,要使用的偵錯組態。", @@ -132,6 +133,7 @@ "cmake-tools.configuration.cmake.debugConfig.setupCommands.description.description": "命令的描述。", "cmake-tools.configuration.cmake.defaultVariants.overall.description": "設定預設變數設定。", "cmake-tools.configuration.cmake.defaultVariants.buildType.description": "組建類型。", + "cmake-tools.configuration.cmake.defaultVariants.buildType.unspecified.long": "讓 CMake 挑選預設組建型別。", "cmake-tools.configuration.cmake.defaultVariants.buildType.debug.long": "停用最佳化 - 包含偵錯資訊。", "cmake-tools.configuration.cmake.defaultVariants.buildType.release.long": "最佳化速度 - 排除偵錯資訊。", "cmake-tools.configuration.cmake.defaultVariants.buildType.minsize.long": "為了讓二進位檔大小最小而最佳化 - 排除偵錯資訊。", @@ -153,6 +155,7 @@ "cmake-tools.configuration.cmake.copyCompileCommands.description": "組態成功之後,將 compile_commands.json 複製到此位置。", "cmake-tools.configuration.cmake.configureOnOpen.description": "開啟 CMake 專案目錄時自動進行組態。", "cmake-tools.configuration.cmake.configureOnEdit.description": "在儲存 cmake.sourceDirectory 或 CMakeLists.txt 內容後,自動設定 CMake 專案目錄。", + "cmake-tools.configuration.cmake.deleteBuildDirOnCleanConfigure.description": "叫用乾淨的設定時,請刪除整個組建目錄。", "cmake-tools.configuration.cmake.setBuildTypeOnMultiConfig.description": "也在多個組態產生器上設定 CMAKE_BUILD_TYPE。", "cmake-tools.configuration.cmake.skipConfigureIfCachePresent.description": "如果有快取,則跳過設定流程。", "cmake-tools.configuration.cmake.cmakeCommunicationMode": "用於在延伸模組與 CMake 之間通訊的通訊協定。", @@ -196,8 +199,10 @@ "cmake-tools.configuration.cmake.revealLog.focus.description": "記錄已顯示,且輸出通道取得游標焦點。", "cmake-tools.configuration.cmake.revealLog.always.description": "記錄已顯示,但輸出通道未取得游標焦點。", "cmake-tools.configuration.cmake.revealLog.never.description": "記錄沒有顯示,也無法取得焦點。", + "cmake-tools.configuration.cmake.revealLog.onError.description": "只有在建置或設定失敗時,才會顯示記錄檔。", "cmake-tools.configuration.cmake.exportCompileCommandsFile.description": "啟用匯出 compile_commands.json。這僅適用於套件案例。在預設案例中,請使用 CMakePresets.json 進行設定", "cmake-tools.configuration.cmake.useCMakePresets.description": "使用 CMakePresets.json 來設定 CMake 設定、建置和測試的磁碟機。使用 CMakePresets.json 時,settings.json 中的套件、變體和某些設定會被忽略。", + "cmake-tools.configuration.cmake.useVsDeveloperEnvironment.description": "在 Windows 上使用 CMake 預設時,請使用 Visual Studio 環境做為父環境。只有在我們偵測到支援的編譯器 (cl、clang、clang-cl、clang-cpp、clang++) 或正在使用 Ninja 產生器時,選取 [自動] 才會套用 Visual Studio 環境。", "cmake-tools.configuration.cmake.allowCommentsInPresetsFile.description": "允許使用 JSON 延伸模組,例如 CMakePresets.json 中的註解。請注意,如果您使用非標準的 JSON,其他 IDE 或命令列可能會將您的 CMakePresets.json 檔案視為無效。", "cmake-tools.configuration.cmake.allowUnsupportedPresetsVersions.description": "啟用使用來自 CMake Tools 延伸模組目前不支援之功能的預設檔案。將忽略未知的屬性和巨集。", "cmake-tools.configuration.cmake.ignoreCMakeListsMissing.description": "如果為 `true`,當工作區中找到某個檔案但卻不在根資料夾中時,延伸就不會要求使用者選取要設定的 CMakeLists.txt 檔案。", diff --git a/i18n/cht/src/cmake/cmakeExecutable.i18n.json b/i18n/cht/src/cmake/cmakeExecutable.i18n.json new file mode 100644 index 000000000..5c1a05ed5 --- /dev/null +++ b/i18n/cht/src/cmake/cmakeExecutable.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "cmake.exe.not.found.in.cache": "在快取中找不到 CMake 可執行檔。正在重新檢查。" +} \ No newline at end of file diff --git a/i18n/cht/src/cmakeProject.i18n.json b/i18n/cht/src/cmakeProject.i18n.json index e80185e76..2273c64cd 100644 --- a/i18n/cht/src/cmakeProject.i18n.json +++ b/i18n/cht/src/cmakeProject.i18n.json @@ -101,6 +101,7 @@ "options.configureWithDebuggerOnFail.do.not.show": "不要再顯示", "configure.failed.tryWithDebugger": "設定失敗。要嘗試使用 CMake 偵錯工具進行設定嗎?", "no.configureWithDebugger.button": "取消", + "cmake.debug.name": "CMake 偵錯工具", "finishing.configure": "正在完成設定", "configure.failed": "無法設定專案", "saving.open.files.before": "正在於設定/建置前儲存開啟的檔案", diff --git a/i18n/cht/src/ctest.i18n.json b/i18n/cht/src/ctest.i18n.json index ed4bfddf4..c4b20afec 100644 --- a/i18n/cht/src/ctest.i18n.json +++ b/i18n/cht/src/ctest.i18n.json @@ -9,10 +9,10 @@ "no.project.found": "找不到資料夾 {0} 的專案", "no.driver.found": "找不到資料夾 {0} 的驅動程式", "ctest.args.not.found": "無法取得測試引數", + "test.results.not.found": "找不到測試結果。", "test.failed.with.exit.code": "測試 {0} 失敗,結束代碼為 {1}。", "test.failed.with.completion.status": "測試 {0} 失敗,完成狀態為「{1}」。", "test.failed": "測試 {0} 失敗。如需詳細資訊,請檢查輸出。", - "test.results.not.found": "找不到測試結果。", "ctest.run.terminated": "已終止 CTest 執行", "ctest.finished.with.code": "CTest 已完成。傳回碼: {0}", "folder.not.found.in.test.explorer": "在測試總管中找不到資料夾: {0}", diff --git a/i18n/cht/src/drivers/cmakeFileApiDriver.i18n.json b/i18n/cht/src/drivers/cmakeFileApiDriver.i18n.json index a55161910..fb81f0c62 100644 --- a/i18n/cht/src/drivers/cmakeFileApiDriver.i18n.json +++ b/i18n/cht/src/drivers/cmakeFileApiDriver.i18n.json @@ -7,7 +7,6 @@ "creating.instance.of": "正在建立 {0} 的執行個體", "removing": "正在移除 {0}", "unlink.failed": "無法移除快取檔案 {0}", - "cmake.debug.name": "CMake 偵錯工具", "toolchains.object.unsupported": "此版 CMake 不支援「工具鏈」物件種類。編譯器路徑會在讀取 CMakeCache.txt 時決定。", "build.all.target": "用來建置所有可用目標的特殊目標", "cmake.install.name": "安裝" diff --git a/i18n/cht/src/expand.i18n.json b/i18n/cht/src/expand.i18n.json index 6f9797843..056630bf6 100644 --- a/i18n/cht/src/expand.i18n.json +++ b/i18n/cht/src/expand.i18n.json @@ -4,11 +4,16 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "circular.variable.reference": "找到循環變數參考: {0}", + "circular.variable.reference.full": "找到循環變數參考: {0}", "reached.max.recursion": "已達到字串展開遞迴的最大值。可能的循環參考。", - "exception.expanding.string": "展開字串 {0} 時發生例外狀況: {1}", - "invalid.variable.reference": "字串中的變數參考 {0} 無效: {1}", + "max.recursion": "最大字串展開遞迴", + "exception.expanding.string.full": "展開字串 {0} 時發生例外狀況: {1}", + "exception.expanding.string": "展開字串時發生例外狀況", + "invalid.variable.reference.full": "字串中的變數參考 {0} 無效: {1}", + "invalid.variable.reference": "無效的變數參考", + "circular.variable.reference": "循環變數參考", "command.not.supported": "字串不支援命令: {0}", - "exception.executing.command": "執行字串的命令 {0} 時發生例外狀況: {1} {2}", + "exception.executing.command.full": "執行字串的命令 {0} 時發生例外狀況: {1} {2}", + "exception.executing.command": "執行命令時發生例外狀況", "expand.expandstringhelper": "已展開 {0}" } \ No newline at end of file diff --git a/i18n/cht/src/extension.i18n.json b/i18n/cht/src/extension.i18n.json index 098e383be..8174a73c3 100644 --- a/i18n/cht/src/extension.i18n.json +++ b/i18n/cht/src/extension.i18n.json @@ -6,15 +6,6 @@ { "rereading.kits": "正在重新讀取套件", "dispose.cmake.tools": "處置 CMake 工具", - "configure.this.project": "是否設定專案 {0}?", - "yes.button": "是", - "not.now.button": "現在不要", - "always.configure.on.open": "永遠在開啟時設定專案嗎?", - "never.configure.on.open": "要在開啟時設定專案嗎?", - "no.button": "否", - "never.button": "永遠不要", - "never.for.this.workspace.button": "不要在此工作區", - "persist.config.on.open.setting": "保存 config-on-open 設定", "configuring.workspace.on.open": "正在於開啟的 {0} 上設定工作區", "configure.now.button": "立即設定", "configure.recommended": "建議您在升級為新套件定義後重新設定。", @@ -35,6 +26,7 @@ "skip.set.workflow.preset": "使用套件,跳過設定工作流程預設: {0}", "no.active.cmake.project": "沒有使用中的 CMake 專案。", "invalid.folder": "資料夾無效。", + "cmake.debug.name": "CMake 偵錯工具", "select.a.cmake.project": "選取 Cmake 專案", "compilation information.not.found": "找不到此檔案的編譯資訊", "add.config.preset.in.test.mode": "在測試模式中執行 CMakeTools。addConfigurePreset 已停用。", diff --git a/i18n/cht/src/preset.i18n.json b/i18n/cht/src/preset.i18n.json index e876eed45..a2e466692 100644 --- a/i18n/cht/src/preset.i18n.json +++ b/i18n/cht/src/preset.i18n.json @@ -18,25 +18,30 @@ "default.workflow.preset": "[預設值]", "default.workflow.preset.description": "未新增任何引數的空白工作流程預設", "circular.inherits.in.config.preset": "循環在設定預設 {0} 中繼承", - "binaryDir.undefined": "設定預設值 {0}: 未指定任何 binaryDir,使用預設值 {1}", - "no.cl.arch": "設定預設{0}: 沒有為 cl.exe 指定架構,預設使用 x86", + "no.cl.arch": "設定預設 {0}: 沒有為 cl.exe 指定結構,依預設使用 {1}", "no.cl.toolset.arch": "設定預設 {0}: 沒有為 cl.exe 指定的工具組架構,預設使用 {1}", "invalid.cl.toolset.arch": "設定預設 {0}: 未預期的工具組架構已指定 {1},您是不是指 {2}?", "no.cl.toolset.version": "設定預設{0}: 沒有為 cl.exe 指定的工具組版本,預設使用最新的工具組版本", "unknown.toolset.option": "將忽略無法識別的工具組選項: {0}", - "config.preset.not.found": "找不到名稱為 {0} 的設定預設", "specified.vs.not.found": "設定預設 {0}: 找不到由 {1} 指定的 Visual Studio 執行個體,會回復預設執行個體查閱行為。", "specified.cl.not.found": "設定預設 {0}: 找不到包含工具組 {2} 和架構 {3} 的編譯器 {1},如果您的電腦具有此工具組,您可能需要執行「CMake: 掃描編譯器」。", + "vs.not.found": "設定預設 {0}: 找不到支援指定工具組 {1} 和結構 {2} 的 Visual Studio 安裝,若此工具組存在於您的電腦上,您可能需要執行「CMake: 掃描編譯器」命令。", "using.vs.instance": "使用 Visual Studio 的開發人員環境 (執行個體 {0},版本 {1},安裝於 {2})", "ninja.not.set": "未在 PATH 上設定忍者,正在嘗試使用{0}", + "config.preset.not.found.full": "找不到名稱為 {0} 的設定預設", + "config.preset.not.found": "找不到設定預設", "property.unsupported.v2": "設定預設值 {0}: 在預設值 v2 中不支援屬性 {1}", + "binaryDir.undefined": "設定預設值 {0}: 未指定任何 binaryDir,使用預設值 {1}", "circular.inherits.in.build.preset": "循環在建置預設 {0} 中繼承", "circular.inherits.in.test.preset": "循環在測試預設 {0} 中繼承", "circular.inherits.in.package.preset": "循環在封裝預設 {0} 中繼承", "circular.inherits.in.workflow.preset": "循環在工作流程預設 {0} 中繼承", - "build.preset.not.found": "找不到名稱為 {0} 的建置預設", - "test.preset.not.found": "找不到名稱為 {0} 的測試預設", - "package.preset.not.found": "找不到名為 {0} 的封裝預設", + "build.preset.not.found.full": "找不到名稱為 {0} 的建置預設", + "build.preset.not.found": "找不到建置預設", + "test.preset.not.found.full": "找不到名稱為 {0} 的測試預設", + "test.preset.not.found": "找不到測試預設", + "package.preset.not.found.full": "找不到名為 {0} 的封裝預設", + "package.preset.not.found": "找不到套件預設", "workflow.preset.not.found": "找不到名稱為 {0} 的工作流程預設", "clean.not.needed.no.prior.config.preset": "不需要清除: 未選取任何預設的預設", "clean.needed.config.preset.changed": "需要清理: 設定預設已變更" diff --git a/i18n/cht/src/presetsController.i18n.json b/i18n/cht/src/presetsController.i18n.json index 2aa020ac4..14cbcbec4 100644 --- a/i18n/cht/src/presetsController.i18n.json +++ b/i18n/cht/src/presetsController.i18n.json @@ -25,6 +25,9 @@ "user.cancelled.compiler.selection": "使用者已取消選取編譯器", "user.selected.compiler": "使用者選取的編譯器 {0}", "select.one.or.more.config.preset.placeholder": "選取一或多個設定預設", + "custom.configure.preset.toolchain.file": "使用工具鏈檔案設定預設", + "description.custom.configure.preset": "設定 Ninja 產生器、建置和安裝目錄", + "custom.configure.preset": "自訂設定預設", "user.selected.config.preset": "使用者選取的設定預設{0}", "yes": "是", "no": "否", @@ -112,8 +115,12 @@ "reading.presets.file": "正在讀取預設的檔案{0}", "failed.to.parse": "無法剖析 {0}: {1}", "included.presets.file.not.found": "找不到包含的預設檔案 {0}", + "expanding.presets.file": "正在展開預設檔案 {0}", + "expansion.errors": "在預設檔案中發現展開錯誤。", + "successfully.expanded.presets.file": "已成功展開預設檔案 {0}", "validating.presets.file": "正在讀取及驗證預設 \"file {0}\"", "unsupported.presets": "在 {0} 中偵測到不支援的預設。支援僅限於版本 {1} 所定義的功能。", + "no.additional.properties": "不應該有其他屬性", "unsupported.presets.disable": "使用 {0} 設定可以忽略未知的屬性和巨集。", "duplicate.build.preset.found": "在組建預設集合 {0} 中找到重複項", "duplicate.test.preset.found": "在測試預設集合 {0} 中找到重複項", @@ -121,9 +128,10 @@ "duplicate.workflow.preset.found": "在工作流程預設集合 {0} 中找到重複項", "workflow.does.not.start.configure.step": "工作流程預設 \"{0}\" 不是以設定步驟開頭。", "workflow.has.subsequent.configure.preset": "工作流程預設 \"{0}\" 的第一步 \"{2}\" 之外,還有另一個設定預設 \"{1}\": ", - "successfully.validated.presets": "已成功在 {0} 中驗證預設", + "successfully.validated.presets": "已成功針對預設結構描述驗證 {0}", "use.kits.variants": "使用套件和變體", "edit.presets": "尋找", "presets.version.error": "不支援 CMakePresets 版本 1。要如何繼續?", - "failed.writing.to.file": "無法寫入檔案 {0}" + "failed.writing.to.file": "無法寫入檔案 {0}", + "failed.to.watch": "無法為 {0}: {1} 監控程式建立容器" } \ No newline at end of file diff --git a/i18n/cht/src/projectStatus.i18n.json b/i18n/cht/src/projectStatus.i18n.json index b18c84641..87d22ad4c 100644 --- a/i18n/cht/src/projectStatus.i18n.json +++ b/i18n/cht/src/projectStatus.i18n.json @@ -24,8 +24,16 @@ "Launch": "啟動", "Folder": "資料夾", "active.folder": "作用中資料夾", + "configPreset.change": "變更設定預設", + "override.settings.applied": "已套用覆寫設定", + "buildPreset.change": "變更建置預設", + "testPreset.change": "變更測試預設", + "packagePreset.change": "變更套件預設", + "workflowPreset.change": "變更工作流程預設", + "kit.change": "變更套件", "set.build.target": "設定組建目標", "set.debug.target": "設定偵錯目標", "set.launch.target": "設定啟動目標", - "select.active.folder": "選取作用中資料夾" + "select.active.folder": "選取作用中資料夾", + "set.variant": "設定變體" } \ No newline at end of file diff --git a/i18n/cht/src/variant.i18n.json b/i18n/cht/src/variant.i18n.json index f63db03ea..31b9084e6 100644 --- a/i18n/cht/src/variant.i18n.json +++ b/i18n/cht/src/variant.i18n.json @@ -9,6 +9,7 @@ "enable.optimizations.omit.debug": "啟用最佳化,發出偵錯調試資訊", "optimize.for.smallest": "針對最小的二進位大小最佳化", "optimize.and.debug": "執行最佳化並包含偵錯資訊", + "unspec.build.type": "讓 CMake 挑選預設組建型別", "constructing": "正在建構 {0}", "reloading.variants.file": "正在重新載入變化檔案 {0}", "reloading.variants.from.settings": "正在從設定重新載入變化", diff --git a/i18n/csy/package.i18n.json b/i18n/csy/package.i18n.json index f10db14db..92ab01bed 100644 --- a/i18n/csy/package.i18n.json +++ b/i18n/csy/package.i18n.json @@ -69,7 +69,7 @@ "cmake-tools.command.cmake.debugTargetAll.title": "Ladit všechny projekty", "cmake-tools.command.cmake.launchTarget.title": "Spustit bez ladění", "cmake-tools.command.cmake.launchTargetAll.title": "Spustit všechny projekty bez ladění", - "cmake-tools.command.cmake.selectLaunchTarget.title": "Nastavit cíl ladění", + "cmake-tools.command.cmake.selectLaunchTarget.title": "Nastavit cíl spuštění/ladění", "cmake-tools.command.cmake.stop.title": "Zrušit sestavení", "cmake-tools.command.cmake.stopAll.title": "Zrušit sestavování pro všechny projekty", "cmake-tools.command.cmake.resetState.title": "Resetovat stav rozšíření nástrojů CMake Tools (pro řešení potíží)", @@ -108,6 +108,7 @@ "cmake-tools.configuration.cmake.ctest.parallelJobs.markdownDescription": "Počet paralelních testovacích úloh. Pokud chcete použít hodnotu `#cmake.parallelJobs#`, použijte nulu. Toto platí pouze v případě, že je hodnota `#cmake.ctest.allowParallelJobs#` nastavená na `true`.", "cmake-tools.configuration.cmake.ctest.allowParallelJobs.description": "Umožňuje paralelní spouštění ctestů, avšak výstup výsledků může být v důsledku toho zkreslený a Průzkumník testů nemusí přesně odrážet průběh testu.", "cmake-tools.configuration.cmake.ctest.testExplorerIntegrationEnabled.description": "Určuje, jestli je povolená integrace s průzkumníkem testů. To je užitečné zakázat, pokud upřednostňujete použití jiného rozšíření pro integraci testů.", + "cmake-tools.configuration.cmake.ctest.testSuiteDelimiter.markdownDescription": "Volitelný oddělovač používaný k oddělení názvů sad testů a hierarchickému seskupení testů v Průzkumníku testů. Tento řetězec se používá v regulárních výrazech, takže pro některé oddělovače může být nutné zadat uvozovací znak. Příklady: `-` (Jeden oddělovač: `-`), `\\.|::` (Dva oddělovače: `.` nebo `::`. Poznámka: Znak `.` musí být uvozen uvozovacími znaky.)", "cmake-tools.configuration.cmake.parseBuildDiagnostics.description": "Analyzovat výstup kompilátoru z hlediska upozornění a chyb", "cmake-tools.configuration.cmake.enabledOutputParsers.description": "Výstupní analyzátory, které se mají použít. Podporované jsou analyzátory `cmake`, `gcc` a `gnuld` pro výstup linkeru ve stylu GNULD, `msvc` pro Microsoft Visual C++, `ghs` pro kompilátor Green Hills s parametry --no_wrap_diagnostics nebo --brief_diagnostics a `diab` pro kompilátor Wind River Diab.", "cmake-tools.configuration.cmake.debugConfig.description": "Konfigurace ladění, která se má použít při ladění cíle", @@ -132,6 +133,7 @@ "cmake-tools.configuration.cmake.debugConfig.setupCommands.description.description": "Popis příkazu", "cmake-tools.configuration.cmake.defaultVariants.overall.description": "Nakonfigurujte výchozí nastavení variant.", "cmake-tools.configuration.cmake.defaultVariants.buildType.description": "Typ sestavení", + "cmake-tools.configuration.cmake.defaultVariants.buildType.unspecified.long": "Umožňuje povolit nástroji CMake vybrat výchozí typ buildu.", "cmake-tools.configuration.cmake.defaultVariants.buildType.debug.long": "Zakázat optimalizace – zahrnout ladicí informace", "cmake-tools.configuration.cmake.defaultVariants.buildType.release.long": "Optimalizovat pro rychlost – vyloučit ladicí informace", "cmake-tools.configuration.cmake.defaultVariants.buildType.minsize.long": "Optimalizovat pro nejmenší velikost binárního souboru – vyloučit ladicí informace", @@ -153,6 +155,7 @@ "cmake-tools.configuration.cmake.copyCompileCommands.description": "Po úspěšné konfiguraci zkopírovat soubor compile_commands.json do tohoto umístění", "cmake-tools.configuration.cmake.configureOnOpen.description": "Automaticky konfigurovat adresáře projektu CMake při jejich otevření", "cmake-tools.configuration.cmake.configureOnEdit.description": "Automaticky nakonfigurovat adresáře projektu CMake, když se uloží obsah cmake.sourceDirectory nebo CMakeLists.txt", + "cmake-tools.configuration.cmake.deleteBuildDirOnCleanConfigure.description": "Při vyvolání čisté konfigurace se odstraní celý adresář sestavení.", "cmake-tools.configuration.cmake.setBuildTypeOnMultiConfig.description": "Nastavte CMAKE_BUILD_TYPE i pro generátory více konfigurací.", "cmake-tools.configuration.cmake.skipConfigureIfCachePresent.description": "Přeskočit proces konfigurace, pokud je k dispozici mezipaměť", "cmake-tools.configuration.cmake.cmakeCommunicationMode": "Protokol, pomocí kterého se komunikuje mezi rozšířením a nástrojem CMake.", @@ -196,8 +199,10 @@ "cmake-tools.configuration.cmake.revealLog.focus.description": "Zobrazí se protokol a výstupní kanál převezme fokus kurzoru.", "cmake-tools.configuration.cmake.revealLog.always.description": "Protokol se zobrazí, ale výstupní kanál nepřevezme zaměření kurzoru.", "cmake-tools.configuration.cmake.revealLog.never.description": "Protokol se nezobrazuje ani nepřijímá zaměření.", + "cmake-tools.configuration.cmake.revealLog.onError.description": "Protokol se zobrazí jenom v případě, že sestavení nebo konfigurace selže.", "cmake-tools.configuration.cmake.exportCompileCommandsFile.description": "Umožňuje exportovat compile_commands.json. Používá se jenom ve scénářích Sady. Ve scénářích Předvolby tuto možnost prosím nastavte pomocí CMakePresets.json", "cmake-tools.configuration.cmake.useCMakePresets.description": "Pomocí CMakePresets.json můžete řídit konfiguraci, sestavování a testování pomocí CMaku. Když budete používat CMakePresets.json, budou se ignorovat sady, varianty a některá další nastavení v souboru settings.json.", + "cmake-tools.configuration.cmake.useVsDeveloperEnvironment.description": "Když se ve Windows používají předvolby CMake, jako nadřazené prostředí se použije prostředí sady Visual Studio. Při výběru možnosti Automaticky se prostředí sady Visual Studio použije pouze tehdy, když zjistíme podporovaný kompilátor (cl, clang, clang-cl, clang-cpp, clang++) nebo když je použit generátor Ninja.", "cmake-tools.configuration.cmake.allowCommentsInPresetsFile.description": "Povolte v CMakePresets.json používání rozšíření JSON, jako jsou třeba komentáře. Pokud použijete nestandardní JSON, ostatní prostředí IDE nebo příkazový řádek může soubor CMakePresets.json považovat za neplatný.", "cmake-tools.configuration.cmake.allowUnsupportedPresetsVersions.description": "Povolí použití souborů předvoleb používajících funkce z verzí, které rozšíření CMake Tools aktuálně nepodporuje. Neznámé vlastnosti a makra se budou ignorovat.", "cmake-tools.configuration.cmake.ignoreCMakeListsMissing.description": "Když se nastaví na `true`, rozšíření nebude uživatele žádat, aby vybral soubor CMakeLists.txt pro konfiguraci, když se nějaký najde v pracovním prostoru, ale ne v kořenové složce.", diff --git a/i18n/csy/src/cmake/cmakeExecutable.i18n.json b/i18n/csy/src/cmake/cmakeExecutable.i18n.json new file mode 100644 index 000000000..131f961f1 --- /dev/null +++ b/i18n/csy/src/cmake/cmakeExecutable.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "cmake.exe.not.found.in.cache": "Spustitelný soubor CMake nebyl nalezen v mezipaměti. Znovu se kontroluje." +} \ No newline at end of file diff --git a/i18n/csy/src/cmakeProject.i18n.json b/i18n/csy/src/cmakeProject.i18n.json index 7c002d501..e36311076 100644 --- a/i18n/csy/src/cmakeProject.i18n.json +++ b/i18n/csy/src/cmakeProject.i18n.json @@ -101,6 +101,7 @@ "options.configureWithDebuggerOnFail.do.not.show": "Znovu nezobrazovat", "configure.failed.tryWithDebugger": "Konfigurace se nezdařila. Chcete se pokusit o konfiguraci pomocí ladicího programu CMake?", "no.configureWithDebugger.button": "Zrušit", + "cmake.debug.name": "Ladicí program CMake", "finishing.configure": "Dokončuje se příkaz configure.", "configure.failed": "Nepovedlo se nakonfigurovat projekt.", "saving.open.files.before": "Ukládají se otevřené soubory před konfigurací/sestavením.", diff --git a/i18n/csy/src/ctest.i18n.json b/i18n/csy/src/ctest.i18n.json index 9cc790cc9..cf5c78a3d 100644 --- a/i18n/csy/src/ctest.i18n.json +++ b/i18n/csy/src/ctest.i18n.json @@ -9,10 +9,10 @@ "no.project.found": "Pro složku {0} se nenašel žádný projekt.", "no.driver.found": "Pro složku {0} se nenašel žádný ovladač.", "ctest.args.not.found": "Nepovedlo se získat argumenty testu.", + "test.results.not.found": "Výsledky testu se nenašly.", "test.failed.with.exit.code": "Test {0} byl neúspěšný s ukončovacím kódem {1}.", "test.failed.with.completion.status": "Test {0} byl neúspěšný se stavem dokončení {1}.", "test.failed": "Test {0} byl neúspěšný. Další informace najdete ve výstupu.", - "test.results.not.found": "Výsledky testu se nenašly.", "ctest.run.terminated": "Běh CTestu se ukončil.", "ctest.finished.with.code": "CTest skončil s návratovým kódem {0}.", "folder.not.found.in.test.explorer": "Složka se nenašla v Průzkumníkovi testů: {0}", diff --git a/i18n/csy/src/drivers/cmakeFileApiDriver.i18n.json b/i18n/csy/src/drivers/cmakeFileApiDriver.i18n.json index d7279e591..35ca0886e 100644 --- a/i18n/csy/src/drivers/cmakeFileApiDriver.i18n.json +++ b/i18n/csy/src/drivers/cmakeFileApiDriver.i18n.json @@ -7,7 +7,6 @@ "creating.instance.of": "Vytváří se instance {0}.", "removing": "Odebírá se {0}.", "unlink.failed": "Nepovedlo se odebrat soubor mezipaměti {0}", - "cmake.debug.name": "Ladicí program CMake", "toolchains.object.unsupported": "Tato verze CMake nepodporuje typ objektu toolchains. Cesty kompilátoru se určí ze souboru CMakeCache.txt.", "build.all.target": "Speciální cíl umožňující sestavení všech dostupných cílů", "cmake.install.name": "Nainstalovat" diff --git a/i18n/csy/src/expand.i18n.json b/i18n/csy/src/expand.i18n.json index a3ec9c005..cfb3888f7 100644 --- a/i18n/csy/src/expand.i18n.json +++ b/i18n/csy/src/expand.i18n.json @@ -4,11 +4,16 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "circular.variable.reference": "Našel se cyklický odkaz na proměnnou: {0}", + "circular.variable.reference.full": "Našel se cyklický odkaz na proměnnou: {0}", "reached.max.recursion": "Dosáhlo se maximální rekurze rozšiřování řetězce. Možná vznikl cyklický odkaz.", - "exception.expanding.string": "Při rozbalování řetězce {0} došlo k výjimce: {1}", - "invalid.variable.reference": "Neplatný odkaz na proměnnou {0} v řetězci: {1}", + "max.recursion": "Maximální rekurze rozšíření řetězce", + "exception.expanding.string.full": "Při rozbalování řetězce {0} došlo k výjimce: {1}", + "exception.expanding.string": "Výjimka při rozbalování řetězce", + "invalid.variable.reference.full": "Neplatný odkaz na proměnnou {0} v řetězci: {1}", + "invalid.variable.reference": "Neplatný odkaz na proměnnou", + "circular.variable.reference": "Cyklický odkaz na proměnnou", "command.not.supported": "Pro řetězec se nepodporují příkazy: {0}", - "exception.executing.command": "Výjimka při provádění příkazu {0} pro řetězec: {1} {2}", + "exception.executing.command.full": "Výjimka při provádění příkazu {0} pro řetězec: {1} {2}", + "exception.executing.command": "Výjimka při provádění příkazu", "expand.expandstringhelper": "rozbaleno: {0}" } \ No newline at end of file diff --git a/i18n/csy/src/extension.i18n.json b/i18n/csy/src/extension.i18n.json index 849eef671..eb871b964 100644 --- a/i18n/csy/src/extension.i18n.json +++ b/i18n/csy/src/extension.i18n.json @@ -6,15 +6,6 @@ { "rereading.kits": "Znovu se čtou sady.", "dispose.cmake.tools": "Uvolnit nástroje CMake Tools", - "configure.this.project": "Chcete nakonfigurovat projekt {0}?", - "yes.button": "Ano", - "not.now.button": "Teď ne", - "always.configure.on.open": "Chcete vždycky konfigurovat projekty při otevření?", - "never.configure.on.open": "Nakonfigurovat projekty při otevření?", - "no.button": "Ne", - "never.button": "Nikdy", - "never.for.this.workspace.button": "Ne pro tento pracovní prostor", - "persist.config.on.open.setting": "Zachovat nastavení konfigurace při otevření", "configuring.workspace.on.open": "Konfiguruje se pracovní prostor při otvírání elementu {0}.", "configure.now.button": "Nakonfigurovat", "configure.recommended": "Po upgradu na novou definici sad se doporučuje změnit konfiguraci.", @@ -35,6 +26,7 @@ "skip.set.workflow.preset": "Používají se sady, přeskočit nastavení předvolby pracovního postupu: {0}", "no.active.cmake.project": "Žádný aktivní projekt CMake.", "invalid.folder": "Neplatná složka", + "cmake.debug.name": "Ladicí program CMake", "select.a.cmake.project": "Vyberte projekt cmake.", "compilation information.not.found": "Nepovedlo se najít informace o kompilaci pro tento soubor.", "add.config.preset.in.test.mode": "Rozšíření CMakeTools běží v testovacím režimu. Element addConfigurePreset je zakázaný.", diff --git a/i18n/csy/src/preset.i18n.json b/i18n/csy/src/preset.i18n.json index c3fb802cd..f78c581c0 100644 --- a/i18n/csy/src/preset.i18n.json +++ b/i18n/csy/src/preset.i18n.json @@ -18,25 +18,30 @@ "default.workflow.preset": "[Výchozí]", "default.workflow.preset.description": "Prázdná předvolba pracovního postupu, která nepřidává žádné argumenty.", "circular.inherits.in.config.preset": "Cyklická dědění v předvolbě konfigurace {0}", - "binaryDir.undefined": "Konfigurace předvolby {0}: Není zadán žádný binaryDir, použije se výchozí hodnota {1}", - "no.cl.arch": "Předvolba konfigurace {0}: Pro cl.exe se nezadala žádná architektura, jako výchozí nastavení se používá x86.", + "no.cl.arch": "Předvolba konfigurace {0}: Pro cl.exe není zadaná žádná architektura. Jako výchozí nastavení se používá {1}.", "no.cl.toolset.arch": "Konfigurace předvolby {0}: Pro cl.exe se nezadala žádná architektura sady nástrojů, jako výchozí nastavení se používá {1}.", "invalid.cl.toolset.arch": "Konfigurace předvolby {0}: Zadala se neočekávaná architektura sady nástrojů {1}. Měli jste na mysli {2}?", "no.cl.toolset.version": "Předvolba konfigurace {0}: Pro cl.exe se nezadala žádná verze sady nástrojů, jako výchozí nastavení se používá ta nejnovější.", "unknown.toolset.option": "Nerozpoznaná možnost sady nástrojů bude ignorována: {0}", - "config.preset.not.found": "Nepovedlo se najít předvolbu konfigurace s názvem {0}.", "specified.vs.not.found": "Konfigurace předvolby {0}: Instance sady Visual Studio zadaná pomocí {1} se nenašla, vrátila se k výchozímu chování vyhledávání instance.", "specified.cl.not.found": "Předvolby konfigurace{0}: Kompilátor {1} se sadou nástrojů {2} a architekturou {3} se nenašel. Pokud tato sada nástrojů v počítači existuje, možná budete muset spustit příkaz „CMake: Vyhledat kompilátory“.", + "vs.not.found": "Předvolba konfigurace {0}: Nebyla nalezena žádná instalace sady Visual Studio, která by podporovala zadanou sadu nástrojů {1} a architekturu {2}. Pokud na vašem počítači existuje tato sada nástrojů, budete možná muset spustit příkaz CMake: Vyhledat kompilátory.", "using.vs.instance": "Použití vývojářského prostředí ze sady Visual Studio (instance {0}, verze {1}, nainstalovaná v {2})", "ninja.not.set": "V proměnné PATH není nastavený nástroj Ninja, probíhá pokus použít {0}.", + "config.preset.not.found.full": "Nepovedlo se najít předvolbu konfigurace s názvem {0}.", + "config.preset.not.found": "Nepovedlo se najít předvolbu konfigurace.", "property.unsupported.v2": "Konfigurace předvolby {0}: Vlastnost {1} se v předvolbách verze 2 nepodporuje", + "binaryDir.undefined": "Konfigurace předvolby {0}: Není zadán žádný binaryDir, použije se výchozí hodnota {1}", "circular.inherits.in.build.preset": "Cyklická dědění v předvolbě buildu {0}", "circular.inherits.in.test.preset": "Cyklická dědění v předvolbě testu {0}", "circular.inherits.in.package.preset": "Cyklická dědění v předvolbě balíčku {0}", "circular.inherits.in.workflow.preset": "Cyklické dědění v předvolbě pracovního postupu {0}", - "build.preset.not.found": "Nepovedlo se najít předvolbu sestavení s názvem {0}.", - "test.preset.not.found": "Nepovedlo se najít předvolbu testování s názvem {0}.", - "package.preset.not.found": "Nepovedlo se najít předvolbu balíčku s názvem {0}.", + "build.preset.not.found.full": "Nepovedlo se najít předvolbu sestavení s názvem {0}.", + "build.preset.not.found": "Nepovedlo se najít předvolbu sestavení.", + "test.preset.not.found.full": "Nepovedlo se najít předvolbu testování s názvem {0}.", + "test.preset.not.found": "Nepovedlo se najít předvolbu testování.", + "package.preset.not.found.full": "Nepovedlo se najít předvolbu balíčku s názvem {0}.", + "package.preset.not.found": "Nepovedlo se najít předvolbu balíčku.", "workflow.preset.not.found": "Předvolbu pracovního postupu s názvem {0} se nepovedlo najít.", "clean.not.needed.no.prior.config.preset": "Čištění není potřeba: Nevybrala se žádná předchozí předvolba konfigurace.", "clean.needed.config.preset.changed": "Nutno vyčistit: Změnila se předvolba konfigurace." diff --git a/i18n/csy/src/presetsController.i18n.json b/i18n/csy/src/presetsController.i18n.json index c996458a2..bd979059b 100644 --- a/i18n/csy/src/presetsController.i18n.json +++ b/i18n/csy/src/presetsController.i18n.json @@ -25,6 +25,9 @@ "user.cancelled.compiler.selection": "Uživatel zrušil výběr kompilátoru.", "user.selected.compiler": "Uživatel vybral kompilátor {0}.", "select.one.or.more.config.preset.placeholder": "Vyberte alespoň jednu předvolbu konfigurace.", + "custom.configure.preset.toolchain.file": "Konfigurovat předvolbu pomocí souboru sady nástrojů", + "description.custom.configure.preset": "Nastaví generátor Ninja, adresář sestavení a instalační adresář", + "custom.configure.preset": "Vlastní předvolba konfigurace", "user.selected.config.preset": "Uživatel vybral předvolbu konfigurace {0}.", "yes": "Ano", "no": "Ne", @@ -112,8 +115,12 @@ "reading.presets.file": "Čte se soubor předvoleb {0}.", "failed.to.parse": "Nepovedlo se parsovat {0}: {1}", "included.presets.file.not.found": "Soubor zahrnutých předvoleb {0} nebyl nalezen.", + "expanding.presets.file": "Rozbaluje se soubor předvoleb {0}.", + "expansion.errors": "V souboru předvoleb se našly chyby rozšíření.", + "successfully.expanded.presets.file": "Soubor předvoleb {0} se úspěšně rozbalil.", "validating.presets.file": "Čtení a ověřování předvoleb souboru {0}", "unsupported.presets": "V {0} se zjistily nepodporované předvolby. Podpora je omezená na funkce definované verzí {1}.", + "no.additional.properties": "NEMĚLO by mít další vlastnosti", "unsupported.presets.disable": "Neznámé vlastnosti a makra lze ignorovat pomocí nastavení {0}.", "duplicate.build.preset.found": "V kolekci předvoleb sestavení se našly duplicity: „{0}“", "duplicate.test.preset.found": "V kolekci předvoleb testů se našly duplicity: „{0}“", @@ -121,9 +128,10 @@ "duplicate.workflow.preset.found": "V kolekci předvoleb pracovních postupů se našly duplicity: „{0}“", "workflow.does.not.start.configure.step": "Předvolba pracovního postupu „{0}“ nezačíná krokem konfigurace.", "workflow.has.subsequent.configure.preset": "Předvolba pracovního postupu „{0}“ má kromě prvního kroku „{2}“ jinou předvolbu konfigurace „{1}“: ", - "successfully.validated.presets": "Předvolby v {0} se úspěšně ověřily.", + "successfully.validated.presets": "{0} se úspěšně ověřil proti schématu předvoleb.", "use.kits.variants": "Používat sady a varianty", "edit.presets": "Vyhledat", "presets.version.error": "CMakePresets verze 1 se nepodporuje. Jak chcete pokračovat?", - "failed.writing.to.file": "Nepovedlo se zapisovat do souboru {0}." + "failed.writing.to.file": "Nepovedlo se zapisovat do souboru {0}.", + "failed.to.watch": "Pro {0} se nepovedlo vytvořit sledovací proces: {1}" } \ No newline at end of file diff --git a/i18n/csy/src/projectStatus.i18n.json b/i18n/csy/src/projectStatus.i18n.json index f87e48d50..b7f653f0d 100644 --- a/i18n/csy/src/projectStatus.i18n.json +++ b/i18n/csy/src/projectStatus.i18n.json @@ -24,8 +24,16 @@ "Launch": "Spustit", "Folder": "Složka", "active.folder": "Aktivní složka", + "configPreset.change": "Změnit předvolbu konfigurace", + "override.settings.applied": "Použito přepsání nastavení", + "buildPreset.change": "Změnit předvolbu sestavení", + "testPreset.change": "Změnit předvolbu testování", + "packagePreset.change": "Změnit předvolbu balíčku", + "workflowPreset.change": "Změnit předvolbu pracovního postupu", + "kit.change": "Změnit sadu", "set.build.target": "Nastavit cíl sestavení", "set.debug.target": "Nastavit cíl ladění", "set.launch.target": "Nastavit cíl spuštění", - "select.active.folder": "Vybrat aktivní složku" + "select.active.folder": "Vybrat aktivní složku", + "set.variant": "Nastavit variantu" } \ No newline at end of file diff --git a/i18n/csy/src/variant.i18n.json b/i18n/csy/src/variant.i18n.json index 4f2a17efa..5506c8688 100644 --- a/i18n/csy/src/variant.i18n.json +++ b/i18n/csy/src/variant.i18n.json @@ -9,6 +9,7 @@ "enable.optimizations.omit.debug": "Povolit optimalizace, vynechat ladicí informace", "optimize.for.smallest": "Optimalizovat pro nejmenší velikost binárního souboru", "optimize.and.debug": "Provést optimalizace A zahrnout ladicí informace", + "unspec.build.type": "Povolit nástroji CMake vybrat výchozí typ buildu", "constructing": "Vytváří se element {0}.", "reloading.variants.file": "Znovu se načítá soubor variant {0}.", "reloading.variants.from.settings": "Znovu se načítají varianty z nastavení.", diff --git a/i18n/deu/package.i18n.json b/i18n/deu/package.i18n.json index 2bedfb73d..7dbcd757b 100644 --- a/i18n/deu/package.i18n.json +++ b/i18n/deu/package.i18n.json @@ -69,7 +69,7 @@ "cmake-tools.command.cmake.debugTargetAll.title": "Alle Projekte debuggen", "cmake-tools.command.cmake.launchTarget.title": "Ohne Debuggen ausführen", "cmake-tools.command.cmake.launchTargetAll.title": "Alle Projekte ohne Debuggen ausführen", - "cmake-tools.command.cmake.selectLaunchTarget.title": "Debugziel festlegen", + "cmake-tools.command.cmake.selectLaunchTarget.title": "Start-/Debugziel festlegen", "cmake-tools.command.cmake.stop.title": "Build abbrechen", "cmake-tools.command.cmake.stopAll.title": "Build für alle Projekte abbrechen", "cmake-tools.command.cmake.resetState.title": "Erweiterungsstatus für CMake Tools zurücksetzen (zur Problembehandlung)", @@ -108,6 +108,7 @@ "cmake-tools.configuration.cmake.ctest.parallelJobs.markdownDescription": "Die Anzahl paralleler Testaufträge. Verwenden Sie 0, um den Wert `#cmake.parallelJobs#` zu verwenden. Das gilt nur, wenn `#cmake.ctest.allowParallelJobs#` auf `true` festgelegt ist.", "cmake-tools.configuration.cmake.ctest.allowParallelJobs.description": "Ermöglicht die parallele Ausführung von ctests. Die Ergebnisausgabe ist jedoch möglicherweise dadurch unverständlich, und der Test-Explorer spiegelt den Teststatus möglicherweise nicht exakt wider.", "cmake-tools.configuration.cmake.ctest.testExplorerIntegrationEnabled.description": "Gibt an, ob die Integration in den Test-Explorer aktiviert ist. Es ist hilfreich diese zu deaktivieren, wenn Sie lieber eine andere Erweiterung für die Testintegration verwenden.", + "cmake-tools.configuration.cmake.ctest.testSuiteDelimiter.markdownDescription": "Optionales Trennzeichen, das zum hierarchischen Trennen von Testsammlungsnamen und Gruppentests im Test-Explorer verwendet wird. Diese Zeichenfolge wird in einem regulären Ausdruck verwendet, sodass einige Trennzeichen möglicherweise mit Escapezeichen versehen werden müssen. Beispiele: `-` ( Ein Trennzeichen: `-`), `\\.|::` (Zwei Trennzeichen: `.` oder `::`. Beachten Sie, dass `.` mit Escapezeichen versehen werden muss.)", "cmake-tools.configuration.cmake.parseBuildDiagnostics.description": "Hiermit wird Compilerausgabe auf Warnungen und Fehler analysiert.", "cmake-tools.configuration.cmake.enabledOutputParsers.description": "Zu verwendende Ausgabeparser. Unterstützte Parser `cmake`, `gcc`, `gnuld` für die Linkerausgabe im GNULD-Format, `msvc` für Microsoft Visual C++, `ghs` für den Green Hills-Compiler mit --no_wrap_diagnostics --brief_diagnostics und `diab` für den Wind River Diab-Compiler.", "cmake-tools.configuration.cmake.debugConfig.description": "Die Debugkonfiguration, die beim Debuggen eines Ziels verwendet werden soll.", @@ -132,6 +133,7 @@ "cmake-tools.configuration.cmake.debugConfig.setupCommands.description.description": "Beschreibung des Befehls.", "cmake-tools.configuration.cmake.defaultVariants.overall.description": "Konfigurieren Sie die Standardvarianteneinstellungen.", "cmake-tools.configuration.cmake.defaultVariants.buildType.description": "Der Buildtyp.", + "cmake-tools.configuration.cmake.defaultVariants.buildType.unspecified.long": "CMake den Standardbuildtyp auswählen lassen.", "cmake-tools.configuration.cmake.defaultVariants.buildType.debug.long": "Optimierungen deaktivieren – Debuginformationen einschließen.", "cmake-tools.configuration.cmake.defaultVariants.buildType.release.long": "Für Geschwindigkeit optimieren – Debuginformationen ausschließen.", "cmake-tools.configuration.cmake.defaultVariants.buildType.minsize.long": "Für kleinste binäre Größe optimieren – Debuginformationen ausschließen.", @@ -153,6 +155,7 @@ "cmake-tools.configuration.cmake.copyCompileCommands.description": "Hiermit wird \"compile_commands.json\" nach erfolgreicher Konfiguration an diesen Speicherort kopiert.", "cmake-tools.configuration.cmake.configureOnOpen.description": "Hiermit werden CMake-Projektverzeichnisse beim Öffnen automatisch konfiguriert.", "cmake-tools.configuration.cmake.configureOnEdit.description": "Hiermit werden CMake-Projektverzeichnisse automatisch konfiguriert, wenn cmake.sourceDirectory- oder CMakeLists.txt-Inhalte gespeichert werden.", + "cmake-tools.configuration.cmake.deleteBuildDirOnCleanConfigure.description": "Löschen Sie das gesamte Buildverzeichnis, wenn clean-configure aufgerufen wird.", "cmake-tools.configuration.cmake.setBuildTypeOnMultiConfig.description": "CMAKE_BUILD_TYPE auch für Generatoren für mehrere Konfigurationen festlegen.", "cmake-tools.configuration.cmake.skipConfigureIfCachePresent.description": "Hiermit wird der Konfigurationsprozess übersprungen, wenn der Cache vorhanden ist.", "cmake-tools.configuration.cmake.cmakeCommunicationMode": "Das für die Kommunikation zwischen der Erweiterung und CMake verwendete Protokoll.", @@ -196,8 +199,10 @@ "cmake-tools.configuration.cmake.revealLog.focus.description": "Das Protokoll wird angezeigt und der Ausgabekanal nimmt den Fokus des Cursors an.", "cmake-tools.configuration.cmake.revealLog.always.description": "Das Protokoll wird angezeigt, aber der Ausgabekanal nimmt den Fokus des Cursors nicht an.", "cmake-tools.configuration.cmake.revealLog.never.description": "Das Protokoll erscheint nicht und nimmt auch nicht den Fokus an.", + "cmake-tools.configuration.cmake.revealLog.onError.description": "Das Protokoll wird nur angezeigt, wenn der Build oder die Konfiguration fehlschlägt.", "cmake-tools.configuration.cmake.exportCompileCommandsFile.description": "Ermöglicht das Exportieren von \"compile_commands.json\". Dies wird nur in Kits-Szenarien verwendet. Legen Sie dies in Voreinstellungsszenarien mithilfe von CMakePresets.json", "cmake-tools.configuration.cmake.useCMakePresets.description": "Benutzen Sie \"CMakePresets.json\", um das Konfigurieren, Erstellen und Testen von \"CMake\" zu steuern. Bei Verwendung von \"CMakePresets.json\" werden Kits, Varianten und einige Einstellungen in \"settings.json\" ignoriert.", + "cmake-tools.configuration.cmake.useVsDeveloperEnvironment.description": "Wenn Sie CMake-Voreinstellungen unter Windows verwenden, verwenden Sie die Visual Studio-Umgebung als übergeordnete Umgebung. Wenn Sie \"Auto\" auswählen, wird die Visual Studio-Umgebung nur angewendet, wenn ein unterstützter Compiler (cl, clang, clang-cl, clang-cpp, clang++) oder der Ninja-Generator verwendet wird.", "cmake-tools.configuration.cmake.allowCommentsInPresetsFile.description": "Hiermit wird die Verwendung von JSON-Erweiterungen, wie z. B. Kommentare in CMakePresets.json, zugelassen. Beachten Sie, dass Ihre CMakePresets.json-Datei von anderen IDEs als ungültig betrachtet werden kann, oder in der Befehlszeile, wenn Sie nicht standardmäßiges JSON verwenden.", "cmake-tools.configuration.cmake.allowUnsupportedPresetsVersions.description": "Aktiviert die Verwendung von Voreinstellungsdateien, die Features aus den Versionen verwenden, die von der Erweiterung \"CMake Tools\" derzeit nicht unterstützt werden. Unbekannte Eigenschaften und Makros werden ignoriert.", "cmake-tools.configuration.cmake.ignoreCMakeListsMissing.description": "`true` gibt an, dass der Benutzer von der Erweiterung nicht aufgefordert wird, eine CMakeLists.txt-Datei für die Konfiguration auszuwählen, wenn eine Datei im Arbeitsbereich, aber nicht im Stammordner gefunden wird.", diff --git a/i18n/deu/src/cmake/cmakeExecutable.i18n.json b/i18n/deu/src/cmake/cmakeExecutable.i18n.json new file mode 100644 index 000000000..ac6ada5d5 --- /dev/null +++ b/i18n/deu/src/cmake/cmakeExecutable.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "cmake.exe.not.found.in.cache": "Die ausführbare CMake-Datei wurde nicht im Cache gefunden. Wird erneut überprüft." +} \ No newline at end of file diff --git a/i18n/deu/src/cmakeProject.i18n.json b/i18n/deu/src/cmakeProject.i18n.json index ae2e21a9f..8a27c1d18 100644 --- a/i18n/deu/src/cmakeProject.i18n.json +++ b/i18n/deu/src/cmakeProject.i18n.json @@ -101,6 +101,7 @@ "options.configureWithDebuggerOnFail.do.not.show": "Nicht mehr anzeigen", "configure.failed.tryWithDebugger": "Fehler beim Konfigurieren. Möchten Sie versuchen, die Konfiguration mit dem CMake-Debugger auszuführen?", "no.configureWithDebugger.button": "Abbrechen", + "cmake.debug.name": "CMake-Debugger", "finishing.configure": "Konfiguration wird beendet.", "configure.failed": "Fehler beim Konfigurieren des Projekts.", "saving.open.files.before": "Geöffnete Dateien werden vor dem Konfigurieren/Erstellen gespeichert.", diff --git a/i18n/deu/src/ctest.i18n.json b/i18n/deu/src/ctest.i18n.json index df93bdd6d..01d5bbe3b 100644 --- a/i18n/deu/src/ctest.i18n.json +++ b/i18n/deu/src/ctest.i18n.json @@ -9,10 +9,10 @@ "no.project.found": "Für den Ordner {0} wurde kein Projekt gefunden.", "no.driver.found": "Für den Ordner {0} wurde kein Treiber gefunden.", "ctest.args.not.found": "Testargumente konnten nicht abgerufen werden.", + "test.results.not.found": "Die Testergebnisse wurden nicht gefunden.", "test.failed.with.exit.code": "Fehler beim Test \"{0}\" mit Exitcode \"{1}\".", "test.failed.with.completion.status": "Fehler beim Test \"{0}\" mit dem Abschlussstatus \"{1}\".", "test.failed": "Fehler beim Test \"{0}\". Weitere Informationen finden Sie in der Ausgabe.", - "test.results.not.found": "Die Testergebnisse wurden nicht gefunden.", "ctest.run.terminated": "Der CTest-Testlauf wurde beendet.", "ctest.finished.with.code": "CTest wurde mit Rückgabecode {0} abgeschlossen.", "folder.not.found.in.test.explorer": "Der Ordner wurde im Test-Explorer nicht gefunden: {0}", diff --git a/i18n/deu/src/drivers/cmakeFileApiDriver.i18n.json b/i18n/deu/src/drivers/cmakeFileApiDriver.i18n.json index 6b436b9ae..e97fe81cf 100644 --- a/i18n/deu/src/drivers/cmakeFileApiDriver.i18n.json +++ b/i18n/deu/src/drivers/cmakeFileApiDriver.i18n.json @@ -7,7 +7,6 @@ "creating.instance.of": "Instanz wird erstellt von {0}", "removing": "Wird entfernt: {0}", "unlink.failed": "Fehler beim Entfernen der Cachedatei {0}", - "cmake.debug.name": "CMake-Debugger", "toolchains.object.unsupported": "Diese Version von CMake bietet keine Unterstützung für die Objektart \"toolchains\". Compilerpfade werden durch Lesen der „Datei CMakeCache.txt“ bestimmt.", "build.all.target": "Ein spezielles Ziel zum Erstellen aller verfügbaren Ziele", "cmake.install.name": "Installieren" diff --git a/i18n/deu/src/expand.i18n.json b/i18n/deu/src/expand.i18n.json index d4ecc51ea..6d53d2d07 100644 --- a/i18n/deu/src/expand.i18n.json +++ b/i18n/deu/src/expand.i18n.json @@ -4,11 +4,16 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "circular.variable.reference": "Kreisförmiger Variablenverweis gefunden: {0}", + "circular.variable.reference.full": "Kreisförmiger Variablenverweis gefunden: {0}", "reached.max.recursion": "Die maximale Rekursion für die Zeichenfolgenerweiterung wurde erreicht. Möglicher Zirkelbezug.", - "exception.expanding.string": "Ausnahme beim Erweitern der Zeichenfolge {0}: {1}", - "invalid.variable.reference": "Ungültiger Variablenverweis {0} in folgender Zeichenfolge: {1}", + "max.recursion": "Maximale Rekursion der Zeichenfolgenerweiterung", + "exception.expanding.string.full": "Ausnahme beim Erweitern der Zeichenfolge {0}: {1}", + "exception.expanding.string": "Ausnahme beim Erweitern der Zeichenfolge", + "invalid.variable.reference.full": "Ungültiger Variablenverweis {0} in folgender Zeichenfolge: {1}", + "invalid.variable.reference": "Ungültiger Variablenverweis", + "circular.variable.reference": "Kreisförmiger Variablenverweis", "command.not.supported": "Befehle werden für die Zeichenfolge nicht unterstützt: {0}", - "exception.executing.command": "Ausnahme beim Ausführen des Befehls {0} für folgende Zeichenfolge: {1} {2}", + "exception.executing.command.full": "Ausnahme beim Ausführen des Befehls {0} für folgende Zeichenfolge: {1} {2}", + "exception.executing.command": "Ausnahme beim Ausführen des Befehls", "expand.expandstringhelper": "{0} erweitert" } \ No newline at end of file diff --git a/i18n/deu/src/extension.i18n.json b/i18n/deu/src/extension.i18n.json index f327adaea..fd0698206 100644 --- a/i18n/deu/src/extension.i18n.json +++ b/i18n/deu/src/extension.i18n.json @@ -6,15 +6,6 @@ { "rereading.kits": "Kits werden erneut gelesen.", "dispose.cmake.tools": "CMake Tools entfernen", - "configure.this.project": "Möchten Sie das Projekt {0} konfigurieren?", - "yes.button": "Ja", - "not.now.button": "Nicht jetzt", - "always.configure.on.open": "Projekte beim Öffnen immer konfigurieren?", - "never.configure.on.open": "Projekte beim Öffnen konfigurieren?", - "no.button": "Nein", - "never.button": "Nie", - "never.for.this.workspace.button": "Nicht dieser Arbeitsbereich", - "persist.config.on.open.setting": "Einstellung \"config-on-open\" beibehalten", "configuring.workspace.on.open": "Arbeitsbereich wird beim Öffnen von {0} konfiguriert.", "configure.now.button": "Jetzt konfigurieren", "configure.recommended": "Nach dem Upgrade auf eine neue Definition der Kits wird eine Neukonfiguration empfohlen.", @@ -35,6 +26,7 @@ "skip.set.workflow.preset": "Überspringen Sie bei Verwendung von Bausätzen die Einstellung der Workflowvoreinstellung: {0}", "no.active.cmake.project": "Kein aktives CMake-Projekt.", "invalid.folder": "Ungültiger Ordner.", + "cmake.debug.name": "CMake-Debugger", "select.a.cmake.project": "Cmake-Projekt auswählen", "compilation information.not.found": "Die Kompilierungsinformationen für diese Datei wurden nicht gefunden.", "add.config.preset.in.test.mode": "CMakeTools wird im Testmodus ausgeführt. addConfigurePreset ist deaktiviert.", diff --git a/i18n/deu/src/preset.i18n.json b/i18n/deu/src/preset.i18n.json index 154864c9a..df57d81fe 100644 --- a/i18n/deu/src/preset.i18n.json +++ b/i18n/deu/src/preset.i18n.json @@ -18,25 +18,30 @@ "default.workflow.preset": "[Standard]", "default.workflow.preset.description": "Eine leere Workflowvoreinstellung, die keine Argumente hinzufügt", "circular.inherits.in.config.preset": "Kreisförmige Erbvorgänge in Konfigurationsvoreinstellung {0}", - "binaryDir.undefined": "Konfigurationsvoreinstellung {0}: Kein binaryDir angegeben, Standardwert wird verwendet:{1}", - "no.cl.arch": "Konfigurationsvoreinstellung {0}: Für cl.exe wurde keine Architektur angegeben, die standardmäßig x86 verwendet", + "no.cl.arch": "Konfigurationsvoreinstellung {0}: Keine Architektur für cl.exe angegeben, standardmäßig wird {1} verwendet.", "no.cl.toolset.arch": "Konfigurationsvoreinstellung {0}: Keine Toolsetarchitektur für cl.exe angegeben, standardmäßig wird {1} verwendet.", "invalid.cl.toolset.arch": "Konfigurationsvoreinstellung {0}: Unerwartete Toolsetarchitektur angegeben: {1}. Meinten Sie {2}?", "no.cl.toolset.version": "Konfigurationsvoreinstellung {0}: Für cl.exe wurde keine Toolsetversion angegeben, die standardmäßig die neueste Version verwendet", "unknown.toolset.option": "Unbekannte Toolset-Option wird ignoriert: {0}", - "config.preset.not.found": "Die Konfigurationsvoreinstellung mit dem Namen {0} wurde nicht gefunden", "specified.vs.not.found": "Voreingestellte {0} konfigurieren: Visual Studio-Instanz, die durch {1} angegeben wurde, wurde nicht gefunden, was auf das Standardverhalten der Instanzsuche zurückgeht.", "specified.cl.not.found": "Konfigurationsvoreinstellung {0}: Compiler {1} mit Toolset {2} und Architektur {3} wurde nicht gefunden. Möglicherweise müssen Sie 'CMake: Scan for Compilers' ausführen, sofern dieses Toolset auf Ihrem Computer vorhanden ist.", + "vs.not.found": "Voreinstellung {0} konfigurieren: Es wurde keine Visual Studio-Installation gefunden, die das angegebene Toolset {1} und die angegebene Architektur {2}unterstützt. Sie müssen möglicherweise den Befehl \"CMake: Scan for Compilers\" ausführen, wenn dieses Toolset auf Ihrem Computer vorhanden ist.", "using.vs.instance": "Verwenden der Entwicklerumgebung von Visual Studio (Instanz {0}, Version {1}, installiert unter {2})", "ninja.not.set": "Ninja ist nicht auf PATH eingestellt, versucht {0} zu verwenden", + "config.preset.not.found.full": "Die Konfigurationsvoreinstellung mit dem Namen {0} wurde nicht gefunden", + "config.preset.not.found": "Die Konfigurationsvoreinstellung wurde nicht gefunden", "property.unsupported.v2": "Konfigurationsvoreinstellung {0}: Eigenschaft {1} nicht unterstützt in Voreinstellungen v2", + "binaryDir.undefined": "Konfigurationsvoreinstellung {0}: Kein binaryDir angegeben, Standardwert wird verwendet:{1}", "circular.inherits.in.build.preset": "Kreisförmige Erbvorgänge in Buildvoreinstellung {0}", "circular.inherits.in.test.preset": "Kreisförmige Erbvorgänge in Testvoreinstellung {0}", "circular.inherits.in.package.preset": "Kreisförmige Erbvorgänge in Paketvoreinstellung {0}", "circular.inherits.in.workflow.preset": "Kreisförmige Erbvorgänge in Workflowvoreinstellung {0}", - "build.preset.not.found": "Die Buildvoreinstellung mit dem Namen {0} wurde nicht gefunden", - "test.preset.not.found": "Die Testvoreinstellung mit dem Namen {0} wurde nicht gefunden", - "package.preset.not.found": "Die Paketvoreinstellung mit dem Namen {0} wurde nicht gefunden", + "build.preset.not.found.full": "Die Buildvoreinstellung mit dem Namen {0} wurde nicht gefunden", + "build.preset.not.found": "Die Buildvoreinstellung konnte nicht gefunden werden", + "test.preset.not.found.full": "Die Testvoreinstellung mit dem Namen {0} wurde nicht gefunden", + "test.preset.not.found": "Die Voreinstellung konnte nicht gefunden werden", + "package.preset.not.found.full": "Die Paketvoreinstellung mit dem Namen {0} wurde nicht gefunden", + "package.preset.not.found": "Die Paketvoreinstellung konnte nicht gefunden werden", "workflow.preset.not.found": "Die Workflowvoreinstellung mit dem Namen {0} wurde nicht gefunden", "clean.not.needed.no.prior.config.preset": "Bereinigung nicht erforderlich: Keine vorherige Konfigurationsvoreinstellung ausgewählt", "clean.needed.config.preset.changed": "Bereinigung erforderlich: Konfigurationsvoreinstellung geändert" diff --git a/i18n/deu/src/presetsController.i18n.json b/i18n/deu/src/presetsController.i18n.json index 43c318948..b947ce6a9 100644 --- a/i18n/deu/src/presetsController.i18n.json +++ b/i18n/deu/src/presetsController.i18n.json @@ -25,6 +25,9 @@ "user.cancelled.compiler.selection": "Auswahl des Compilers vom Benutzer abgebrochenen", "user.selected.compiler": "Compiler {0} vom Benutzer ausgewählt", "select.one.or.more.config.preset.placeholder": "Wählen Sie mindestens eine Konfigurationsvoreinstellung aus", + "custom.configure.preset.toolchain.file": "Voreinstellung mithilfe der Toolkettendatei konfigurieren", + "description.custom.configure.preset": "Legt Ninja Generator fest, erstellt und installiert das Verzeichnis.", + "custom.configure.preset": "Benutzerdefinierte Konfigurationsvoreinstellung", "user.selected.config.preset": "Konfigurationsvoreinstellung {0} vom Benutzer ausgewählt", "yes": "Ja", "no": "Nein", @@ -112,8 +115,12 @@ "reading.presets.file": "Datei mit Lesevoreinstellungen {0}", "failed.to.parse": "Fehler beim Analysieren von {0}: {1}", "included.presets.file.not.found": "Enthaltene Voreinstellungsdatei {0} kann nicht gefunden werden", + "expanding.presets.file": "Die Voreinstellungsdatei {0} wird erweitert", + "expansion.errors": "Erweiterungsfehler in der Voreinstellungsdatei gefunden.", + "successfully.expanded.presets.file": "Die Voreinstellungsdatei {0} wurde erfolgreich erweitert", "validating.presets.file": "Die Voreinstellung \"file {0}\" wird gelesen und überprüft.", "unsupported.presets": "In {0} wurden nicht unterstützte Voreinstellungen erkannt. Die Unterstützung ist auf Features beschränkt, die von der Version {1} definiert werden.", + "no.additional.properties": "darf KEINE zusätzlichen Eigenschaften aufweisen.", "unsupported.presets.disable": "Unbekannte Eigenschaften und Makros können mithilfe der Einstellung {0} ignoriert werden.", "duplicate.build.preset.found": "In der Sammlung der Buildvoreinstellungen wurden Duplikate gefunden: \"{0}\"", "duplicate.test.preset.found": "In der Sammlung der Testvoreinstellungen wurden Duplikate gefunden: \"{0}\"", @@ -121,9 +128,10 @@ "duplicate.workflow.preset.found": "In der Sammlung der Workflowvoreinstellungen wurden Duplikate gefunden: \"{0}\"", "workflow.does.not.start.configure.step": "Die Workflowvoreinstellung \"{0}\" beginnt nicht mit einem Konfigurationsschritt.", "workflow.has.subsequent.configure.preset": "Die Workflowvoreinstellung \"{0}\" verfügt über eine andere Konfigurationsvoreinstellung \"{1}\" neben dem ersten Schritt \"{2}\": ", - "successfully.validated.presets": "Voreinstellungen wurden erfolgreich in {0} überprüft", + "successfully.validated.presets": "Erfolgreiche Validierung von {0} gegen das vorgegebene Schema", "use.kits.variants": "Verwenden von Kits und Varianten", "edit.presets": "Suchen", "presets.version.error": "CMakePresets Version 1 wird nicht unterstützt. Wie möchten Sie fortfahren?", - "failed.writing.to.file": "Fehler beim Schreiben in Datei {0}" + "failed.writing.to.file": "Fehler beim Schreiben in Datei {0}", + "failed.to.watch": "Watcher konnte nicht für {0}: {1} erstellt werden." } \ No newline at end of file diff --git a/i18n/deu/src/projectStatus.i18n.json b/i18n/deu/src/projectStatus.i18n.json index 5765b18a3..49a5deeb2 100644 --- a/i18n/deu/src/projectStatus.i18n.json +++ b/i18n/deu/src/projectStatus.i18n.json @@ -24,8 +24,16 @@ "Launch": "Starten", "Folder": "Ordner", "active.folder": "Aktiver Ordner", + "configPreset.change": "Konfigurationsvoreinstellung ändern", + "override.settings.applied": "Angewendete Einstellungen überschreiben", + "buildPreset.change": "Buildvoreinstellung ändern", + "testPreset.change": "Testvoreinstellung ändern", + "packagePreset.change": "Paketvoreinstellung ändern", + "workflowPreset.change": "Workflowvoreinstellung ändern", + "kit.change": "Kit ändern", "set.build.target": "Buildziel festlegen", "set.debug.target": "Debugziel festlegen", "set.launch.target": "Startziel festlegen", - "select.active.folder": "Aktiven Ordner auswählen" + "select.active.folder": "Aktiven Ordner auswählen", + "set.variant": "Variante festlegen" } \ No newline at end of file diff --git a/i18n/deu/src/variant.i18n.json b/i18n/deu/src/variant.i18n.json index 979a522e5..cf4591f81 100644 --- a/i18n/deu/src/variant.i18n.json +++ b/i18n/deu/src/variant.i18n.json @@ -9,6 +9,7 @@ "enable.optimizations.omit.debug": "Optimierungen aktivieren, Debuginformationen auslassen", "optimize.for.smallest": "Für die kleinste binäre Größe optimieren", "optimize.and.debug": "Optimierungen durchführen UND Debuginformationen einschließen", + "unspec.build.type": "CMake den Standardbuildtyp auswählen lassen", "constructing": "Erstellen von {0}", "reloading.variants.file": "Variantendatei wird erneut geladen: {0}", "reloading.variants.from.settings": "Varianten werden aus den Einstellungen neu geladen.", diff --git a/i18n/esn/package.i18n.json b/i18n/esn/package.i18n.json index cdedb901b..2fc251397 100644 --- a/i18n/esn/package.i18n.json +++ b/i18n/esn/package.i18n.json @@ -69,7 +69,7 @@ "cmake-tools.command.cmake.debugTargetAll.title": "Depurar todos los proyectos", "cmake-tools.command.cmake.launchTarget.title": "Ejecutar sin depuración", "cmake-tools.command.cmake.launchTargetAll.title": "Ejecutar todos los proyectos sin depuración", - "cmake-tools.command.cmake.selectLaunchTarget.title": "Establecer el destino de depuración", + "cmake-tools.command.cmake.selectLaunchTarget.title": "Establecer destino de inicio/depuración", "cmake-tools.command.cmake.stop.title": "Cancelar compilación", "cmake-tools.command.cmake.stopAll.title": "Cancelar la compilación de todos los proyectos", "cmake-tools.command.cmake.resetState.title": "Restablecer el estado de la extensión Herramientas de CMake (para solucionar problemas)", @@ -108,6 +108,7 @@ "cmake-tools.configuration.cmake.ctest.parallelJobs.markdownDescription": "Número de trabajos de prueba paralelos. Use cero para usar el valor de `#cmake.parallelJobs#`. Esto solo se aplica cuando `#cmake.ctest.allowParallelJobs#` está establecido en `true`.", "cmake-tools.configuration.cmake.ctest.allowParallelJobs.description": "Permite que las pruebas ctest se ejecuten en paralelo, aunque la salida del resultado puede ser confusa y el Explorador de pruebas puede no reflejar con precisión el progreso de la prueba.", "cmake-tools.configuration.cmake.ctest.testExplorerIntegrationEnabled.description": "Si está habilitada o no la integración con el explorador de pruebas. Esto resulta útil para deshabilitarlo si prefiere usar una extensión diferente para la integración de prueba.", + "cmake-tools.configuration.cmake.ctest.testSuiteDelimiter.markdownDescription": "Delimitador opcional que se usa para separar jerárquicamente los nombres de los conjuntos de pruebas y las pruebas de grupo en el Explorador de pruebas. Esta cadena se usa en una expresión regular, por lo que puede necesitar que se escapen algunos delimitadores. Ejemplos: `-` (un delimitador: `-`), `\\.|::` (dos delimitadores: `.` o `::`. Tenga en cuenta que debe escapar `.`).", "cmake-tools.configuration.cmake.parseBuildDiagnostics.description": "Analiza la salida del compilador para encontrar advertencias y errores.", "cmake-tools.configuration.cmake.enabledOutputParsers.description": "Analizadores de salida que se van a usar. Analizadores admitidos: `cmake`, `gcc`, `gnuld` para la salida del enlazador GNULD, `msvc` para Microsoft Visual C++, `ghs` para el compilador de Green Hills con --no_wrap_diagnostics --brief_diagnostics y `diab` para el compilador de Wind River Diab.", "cmake-tools.configuration.cmake.debugConfig.description": "Configuración de depuración que se va a usar al depurar un destino.", @@ -132,6 +133,7 @@ "cmake-tools.configuration.cmake.debugConfig.setupCommands.description.description": "Descripción del comando.", "cmake-tools.configuration.cmake.defaultVariants.overall.description": "Configure los ajustes por defecto de la variante.", "cmake-tools.configuration.cmake.defaultVariants.buildType.description": "El tipo de compilación.", + "cmake-tools.configuration.cmake.defaultVariants.buildType.unspecified.long": "Deje que CMake elija el tipo de compilación predeterminado.", "cmake-tools.configuration.cmake.defaultVariants.buildType.debug.long": "Deshabilitar optimizaciones: incluir información de depuración.", "cmake-tools.configuration.cmake.defaultVariants.buildType.release.long": "Optimizar la velocidad: excluir información de depuración.", "cmake-tools.configuration.cmake.defaultVariants.buildType.minsize.long": "Optimizar para el tamaño binario más pequeño: excluir información de depuración.", @@ -153,6 +155,7 @@ "cmake-tools.configuration.cmake.copyCompileCommands.description": "Copia compile_commands.json en esta ubicación después de una configuración correcta.", "cmake-tools.configuration.cmake.configureOnOpen.description": "Configura automáticamente los directorios del proyecto de CMake al abrirlos.", "cmake-tools.configuration.cmake.configureOnEdit.description": "Configure automáticamente los directorios de proyectos de CMake cuando se guarde el contenido de cmake.sourceDirectory o CMakeLists.txt.", + "cmake-tools.configuration.cmake.deleteBuildDirOnCleanConfigure.description": "Elimine todo el directorio de compilación cuando se invoque una configuración limpia.", "cmake-tools.configuration.cmake.setBuildTypeOnMultiConfig.description": "Establecer CMAKE_BUILD_TYPE también en generadores multi configuración.", "cmake-tools.configuration.cmake.skipConfigureIfCachePresent.description": "Omite el proceso de configuración si la memoria caché está presente.", "cmake-tools.configuration.cmake.cmakeCommunicationMode": "El protocolo utilizado para comunicarse entre la extensión y CMake.", @@ -196,8 +199,10 @@ "cmake-tools.configuration.cmake.revealLog.focus.description": "El registro aparece y el canal de salida detecta el foco del cursor.", "cmake-tools.configuration.cmake.revealLog.always.description": "El registro aparece, pero el canal de salida no detecta el foco del cursor.", "cmake-tools.configuration.cmake.revealLog.never.description": "El registro no aparece ni detecta el foco.", + "cmake-tools.configuration.cmake.revealLog.onError.description": "El registro solo aparece cuando se produce un error en la compilación o la configuración.", "cmake-tools.configuration.cmake.exportCompileCommandsFile.description": "Habilita la exportación de compile_commands.json. Esto solo se usa en escenarios de kits. En escenarios de valores preestablecidos, establézcalo mediante CMakePresets.json", "cmake-tools.configuration.cmake.useCMakePresets.description": "Use CMakePresets.json para configurar, compilar y probar la unidad CMake. Cuando use CMakePresets.json, los kits, las variantes y algunos valores de configuración de settings.json se omitirán.", + "cmake-tools.configuration.cmake.useVsDeveloperEnvironment.description": "Al usar valores preestablecidos de CMake en Windows, use el entorno de Visual Studio como entorno primario. La selección automática solo aplicará el entorno de Visual Studio cuando detectemos un compilador compatible (cl, clang, clang-cl, clang-cpp, clang++) o cuando se use el generador Ninja.", "cmake-tools.configuration.cmake.allowCommentsInPresetsFile.description": "Permitir el uso de extensiones JSON como comentarios en CMakePresets.json. Tenga en cuenta que el archivo CMakePresets.json puede considerarse no válido por otros IDE o en la línea de comandos si usa JSON no estándar.", "cmake-tools.configuration.cmake.allowUnsupportedPresetsVersions.description": "Habilita el uso de archivos preestablecidos que usan características de las versiones que la extensión herramientas de CMake no admite actualmente. Se omitirán las propiedades y macros desconocidas.", "cmake-tools.configuration.cmake.ignoreCMakeListsMissing.description": "Si es `true`, la extensión no pedirá al usuario que seleccione un archivo CMakeLists.txt para la configuración cuando se encuentre uno en el área de trabajo, pero no en la carpeta raíz.", diff --git a/i18n/esn/src/cmake/cmakeExecutable.i18n.json b/i18n/esn/src/cmake/cmakeExecutable.i18n.json new file mode 100644 index 000000000..96a69b503 --- /dev/null +++ b/i18n/esn/src/cmake/cmakeExecutable.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "cmake.exe.not.found.in.cache": "No se encontró el ejecutable de CMake en caché. Comprobando de nuevo." +} \ No newline at end of file diff --git a/i18n/esn/src/cmakeProject.i18n.json b/i18n/esn/src/cmakeProject.i18n.json index f2421eb26..889c48a72 100644 --- a/i18n/esn/src/cmakeProject.i18n.json +++ b/i18n/esn/src/cmakeProject.i18n.json @@ -101,6 +101,7 @@ "options.configureWithDebuggerOnFail.do.not.show": "No volver a mostrar", "configure.failed.tryWithDebugger": "Error de configuración. ¿Desea intentar configurar con el depurador de CMake?", "no.configureWithDebugger.button": "Cancelar", + "cmake.debug.name": "Depurador de CMake", "finishing.configure": "Finalizando la configuración", "configure.failed": "No se pudo configurar el proyecto.", "saving.open.files.before": "Guardando los archivos abiertos antes de configurar o compilar", diff --git a/i18n/esn/src/ctest.i18n.json b/i18n/esn/src/ctest.i18n.json index ae5c6ea28..4a6533427 100644 --- a/i18n/esn/src/ctest.i18n.json +++ b/i18n/esn/src/ctest.i18n.json @@ -9,10 +9,10 @@ "no.project.found": "No se ha encontrado ningún proyecto para la carpeta {0}", "no.driver.found": "No se ha encontrado ningún controlador para la carpeta {0}", "ctest.args.not.found": "No se pudieron obtener los argumentos de prueba", + "test.results.not.found": "No se encontraron los resultados de la prueba.", "test.failed.with.exit.code": "La prueba {0} ha fallado con código {1} de salida .", "test.failed.with.completion.status": "La prueba {0} fallida con estado de finalización \"{1}\".", "test.failed": "La prueba {0} ha fallado. Compruebe el resultado para obtener más información.", - "test.results.not.found": "No se encontraron los resultados de la prueba.", "ctest.run.terminated": "La ejecución de CTest ha finalizado.", "ctest.finished.with.code": "CTest finalizó con el código de retorno {0}", "folder.not.found.in.test.explorer": "No se ha encontrado la carpeta en el Explorador de pruebas: {0}", diff --git a/i18n/esn/src/drivers/cmakeFileApiDriver.i18n.json b/i18n/esn/src/drivers/cmakeFileApiDriver.i18n.json index a50ca298f..eb8ec5f35 100644 --- a/i18n/esn/src/drivers/cmakeFileApiDriver.i18n.json +++ b/i18n/esn/src/drivers/cmakeFileApiDriver.i18n.json @@ -7,7 +7,6 @@ "creating.instance.of": "Creando una instancia de {0}", "removing": "Quitando {0}", "unlink.failed": "No se pudo quitar el archivo caché {0}", - "cmake.debug.name": "Depurador de CMake", "toolchains.object.unsupported": "Esta versión de CMake no admite la variante de objeto \"toolchains\". Las rutas de acceso del compilador se determinarán al leer CMakeCache.txt.", "build.all.target": "Un destino especial para compilar todos los destinos disponibles", "cmake.install.name": "Instalar" diff --git a/i18n/esn/src/expand.i18n.json b/i18n/esn/src/expand.i18n.json index e1a9afcc2..8b95d4d8c 100644 --- a/i18n/esn/src/expand.i18n.json +++ b/i18n/esn/src/expand.i18n.json @@ -4,11 +4,16 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "circular.variable.reference": "Referencia de variable circular encontrada: {0}", + "circular.variable.reference.full": "Referencia de variable circular encontrada: {0}", "reached.max.recursion": "Se ha alcanzado la recursividad de expansión de cadena máxima. Posible referencia circular.", - "exception.expanding.string": "Excepción al expandir la cadena {0}: {1}", - "invalid.variable.reference": "Referencia de variable {0} no válida en la cadena: {1}", + "max.recursion": "Recursividad máxima de expansión de cadenas", + "exception.expanding.string.full": "Excepción al expandir la cadena {0}: {1}", + "exception.expanding.string": "Cadena de expansión de excepciones", + "invalid.variable.reference.full": "Referencia de variable {0} no válida en la cadena: {1}", + "invalid.variable.reference": "Referencia de variable no válida", + "circular.variable.reference": "Referencia de variable circular", "command.not.supported": "Comandos no admitidos para la cadena: {0}", - "exception.executing.command": "Excepción al ejecutar el comando {0} para la cadena: {1} {2}", + "exception.executing.command.full": "Excepción al ejecutar el comando {0} para la cadena: {1} {2}", + "exception.executing.command": "Excepción al ejecutar el comando", "expand.expandstringhelper": "Se ha expandido {0}" } \ No newline at end of file diff --git a/i18n/esn/src/extension.i18n.json b/i18n/esn/src/extension.i18n.json index 71ad944af..5c4821600 100644 --- a/i18n/esn/src/extension.i18n.json +++ b/i18n/esn/src/extension.i18n.json @@ -6,15 +6,6 @@ { "rereading.kits": "Volver a leer los kits", "dispose.cmake.tools": "Desechar las Herramientas de CMake", - "configure.this.project": "¿Quiere configurar el proyecto {0}?", - "yes.button": "Sí", - "not.now.button": "Ahora no", - "always.configure.on.open": "¿Configurar siempre los proyectos al abrirlos?", - "never.configure.on.open": "¿Quiere configurar los proyectos al abrirlos?", - "no.button": "No", - "never.button": "Nunca", - "never.for.this.workspace.button": "No en esta área de trabajo", - "persist.config.on.open.setting": "Conservar los valores de configuración al abrir", "configuring.workspace.on.open": "Configuración del área de trabajo al abrir {0}", "configure.now.button": "Configurar ahora", "configure.recommended": "Se recomienda volver a configurar después de actualizar a una nueva definición de los kits.", @@ -35,6 +26,7 @@ "skip.set.workflow.preset": "Uso de kits, omitir la configuración del valor preestablecido del flujo de trabajo: {0}", "no.active.cmake.project": "No hay ningún proyecto de CMake activo.", "invalid.folder": "La carpeta no es válida.", + "cmake.debug.name": "Depurador de CMake", "select.a.cmake.project": "Seleccione un proyecto de CMake", "compilation information.not.found": "No se encuentra la información de compilación para este archivo.", "add.config.preset.in.test.mode": "Ejecutando CMakeTools en modo de prueba. El elemento addConfigurePreset está deshabilitado.", diff --git a/i18n/esn/src/preset.i18n.json b/i18n/esn/src/preset.i18n.json index ed87523ad..938f7a038 100644 --- a/i18n/esn/src/preset.i18n.json +++ b/i18n/esn/src/preset.i18n.json @@ -18,25 +18,30 @@ "default.workflow.preset": "[Predeterminado]", "default.workflow.preset.description": "Un valor preestablecido de flujo de trabajo vacío que no agrega ningún argumento", "circular.inherits.in.config.preset": "Circular hereda en valores preestablecidos de configuración de {0}", - "binaryDir.undefined": "Configurar {0} preestablecido: no se especificó un binaryDir, se usará el valor predeterminado {1}", - "no.cl.arch": "Configuración preestablecida {0}: no se ha especificado ninguna arquitectura para cl.exe; se usará x86 de forma predeterminada", + "no.cl.arch": "Configuración preestablecida{0}: No se especificó ninguna arquitectura para cl.exe mediante {1} de forma predeterminada", "no.cl.toolset.arch": "Configurar {0} preestablecido: no se ha especificado ninguna arquitectura de conjunto de herramientas para cl.exe; se usará {1} de forma predeterminada", "invalid.cl.toolset.arch": "Configurar {0} preestablecido: se especificó una arquitectura de conjunto de herramientas inesperada {1}, ¿quiso decir {2}?", "no.cl.toolset.version": "Configuración preestablecida {0}: no se especificó ninguna versión de conjunto de herramientas para cl.exe; se usará la más reciente de forma predeterminada.", "unknown.toolset.option": "Se omitirá la opción de conjunto de herramientas no reconocido: {0}", - "config.preset.not.found": "No se encontró la configuración preestablecida con el nombre {0}", "specified.vs.not.found": "Configurar el valor preestablecido {0}: no se encontró la instancia de Visual Studio especificada por {1}, revirtiendo al comportamiento de búsqueda de la instancia predeterminada.", "specified.cl.not.found": "Configurar {0} preestablecido: no se encontró el compilador {1} con el conjunto de herramientas {2} y la arquitectura {3}. Es posible que tenga que ejecutar el comando \"CMake: buscar compiladores\" si este conjunto de herramientas existe en el equipo.", + "vs.not.found": "Configuración preestablecida{0}: No se encontró ninguna instalación Visual Studio que admita el conjunto de herramientas especificado {1} y arquitectura {2}, es posible que tenga que ejecutar el comando \"CMake: Buscar compiladores\" si este conjunto de herramientas existe en el equipo.", "using.vs.instance": "Uso del entorno de desarrollador de Visual Studio (instancia {0}, versión {1}, instalada en {2})", "ninja.not.set": "Ninja no está establecido en la ruta de acceso; se está intentando usar {0}.", + "config.preset.not.found.full": "No se encontró la configuración preestablecida con el nombre {0}", + "config.preset.not.found": "No se pudo encontrar el valor preestablecido de configuración", "property.unsupported.v2": "Configurar {0} preestablecido: la propiedad {1} no se admite en los valores prestablecidos V2", + "binaryDir.undefined": "Configurar {0} preestablecido: no se especificó un binaryDir, se usará el valor predeterminado {1}", "circular.inherits.in.build.preset": "Circular hereda en valores preestablecidos de compilación {0}", "circular.inherits.in.test.preset": "Circular hereda en valores preestablecidos en prueba{0}", "circular.inherits.in.package.preset": "Circular hereda en {0}preestablecidas del paquete", "circular.inherits.in.workflow.preset": "Circular hereda en {0}preestablecidos de flujo de trabajo", - "build.preset.not.found": "No se ha encontrado la compilación preestablecida con el nombre {0}", - "test.preset.not.found": "No ha encontrado se la prueba preestablecida con el nombre {0}.", - "package.preset.not.found": "No se encontró el valor preestablecido del paquete con el nombre {0}", + "build.preset.not.found.full": "No se ha encontrado la compilación preestablecida con el nombre {0}", + "build.preset.not.found": "No se encontró el valor preestablecido de compilación", + "test.preset.not.found.full": "No ha encontrado se la prueba preestablecida con el nombre {0}.", + "test.preset.not.found": "No se pudo encontrar el valor preestablecido de prueba", + "package.preset.not.found.full": "No se encontró el valor preestablecido del paquete con el nombre {0}", + "package.preset.not.found": "No se pudo encontrar el valor preestablecido del paquete", "workflow.preset.not.found": "No se encontró el valor preestablecido de flujo de trabajo con el nombre {0}", "clean.not.needed.no.prior.config.preset": "Limpieza no necesaria: no se ha seleccionado ninguna configuración preestablecida previa seleccionada", "clean.needed.config.preset.changed": "Es necesario limpiar: configuración preestablecida cambiada" diff --git a/i18n/esn/src/presetsController.i18n.json b/i18n/esn/src/presetsController.i18n.json index e3908c731..ff9699679 100644 --- a/i18n/esn/src/presetsController.i18n.json +++ b/i18n/esn/src/presetsController.i18n.json @@ -25,6 +25,9 @@ "user.cancelled.compiler.selection": "Selección del compilador cancelada por el usuario", "user.selected.compiler": "Compilador {0} seleccionado por el usuario", "select.one.or.more.config.preset.placeholder": "Seleccionar una o más configuraciones preestablecidas", + "custom.configure.preset.toolchain.file": "Configuración de valores preestablecidos mediante el archivo de cadena de herramientas", + "description.custom.configure.preset": "Establece el generador Ninja, compilación e instalación del directorio", + "custom.configure.preset": "Configuración personalizada preestablecida", "user.selected.config.preset": "Configuración preestablecida {0} seleccionada por el usuario", "yes": "Sí", "no": "No", @@ -112,8 +115,12 @@ "reading.presets.file": "Lectura del archivo de valores preestablecidos {0}", "failed.to.parse": "No se pudo analizar {0}: {1}", "included.presets.file.not.found": "El archivo de valores preestablecidos incluidos {0} no se encuentra", + "expanding.presets.file": "Expandiendo archivo de valores preestablecidos {0}", + "expansion.errors": "Errores de expansión encontrados en el archivo de valores preestablecidos.", + "successfully.expanded.presets.file": "Archivo de valores preestablecidos {0} expandido correctamente", "validating.presets.file": "Leyendo y validando los valores preestablecidos de \"file {0}\"", "unsupported.presets": "Se detectaron valores preestablecidos no admitidos en {0}. La compatibilidad se limita a las características definidas por la versión {1}.", + "no.additional.properties": "NO debe tener propiedades adicionales", "unsupported.presets.disable": "Las macros y las propiedades desconocidas se pueden omitir mediante la configuración de {0}.", "duplicate.build.preset.found": "Se encontraron duplicados en la colección de valores preestablecidos de compilación: \"{0}\"", "duplicate.test.preset.found": "Se encontraron duplicados en la colección de valores preestablecidos de prueba: \"{0}\"", @@ -121,9 +128,10 @@ "duplicate.workflow.preset.found": "Se encontraron duplicados en la colección de valores preestablecidos de flujo de trabajo: \"{0}\"", "workflow.does.not.start.configure.step": "El valor preestablecido de flujo de trabajo \"{0}\" no empieza por un paso de configuración.", "workflow.has.subsequent.configure.preset": "El valor preestablecido de flujo de trabajo \"{0}\" tiene otro valor preestablecido de configuración \"{1}\" además del primer paso \"{2}\": ", - "successfully.validated.presets": "Los valores preestablecidos se validaron correctamente en {0}", + "successfully.validated.presets": "{0} validado con éxito con el esquema preestablecido", "use.kits.variants": "Usar kits y variantes", "edit.presets": "Buscar", "presets.version.error": "CMakePresets versión 1 no es compatible. ¿Qué quiere hacer?", - "failed.writing.to.file": "No se pudo escribir en el archivo {0}" + "failed.writing.to.file": "No se pudo escribir en el archivo {0}", + "failed.to.watch": "No se pudo crear el monitor para {0}: {1}" } \ No newline at end of file diff --git a/i18n/esn/src/projectStatus.i18n.json b/i18n/esn/src/projectStatus.i18n.json index 3815dcbf8..2d7d89d5f 100644 --- a/i18n/esn/src/projectStatus.i18n.json +++ b/i18n/esn/src/projectStatus.i18n.json @@ -24,8 +24,16 @@ "Launch": "Iniciar", "Folder": "Carpeta", "active.folder": "Carpeta activa", + "configPreset.change": "Cambie configuración preestablecida", + "override.settings.applied": "Invalidación de la configuración aplicada", + "buildPreset.change": "Cambie valor preestablecido de compilación", + "testPreset.change": "Cambiar valor preestablecido de prueba", + "packagePreset.change": "Cambie el valor preestablecido del paquete", + "workflowPreset.change": "Cambiar valor preestablecido de flujo de trabajo", + "kit.change": "Cambie kit", "set.build.target": "Establecer el destino de compilación", "set.debug.target": "Establecer el destino de depuración", "set.launch.target": "Establecer destino de inicio", - "select.active.folder": "Seleccionar la carpeta activa" + "select.active.folder": "Seleccionar la carpeta activa", + "set.variant": "Establece variante" } \ No newline at end of file diff --git a/i18n/esn/src/variant.i18n.json b/i18n/esn/src/variant.i18n.json index 564fc7e79..b275a163a 100644 --- a/i18n/esn/src/variant.i18n.json +++ b/i18n/esn/src/variant.i18n.json @@ -9,6 +9,7 @@ "enable.optimizations.omit.debug": "Habilitar optimizaciones, omitir información de depuración", "optimize.for.smallest": "Optimizar para el tamaño binario más pequeño", "optimize.and.debug": "Realizar optimizaciones e incluir información de depuración", + "unspec.build.type": "Permitir que CMake elija el tipo de compilación predeterminado", "constructing": "Creando {0}", "reloading.variants.file": "Recargando el archivo de variantes {0}", "reloading.variants.from.settings": "Recargando las variantes desde la configuración", diff --git a/i18n/fra/package.i18n.json b/i18n/fra/package.i18n.json index 5517c499a..8508aee82 100644 --- a/i18n/fra/package.i18n.json +++ b/i18n/fra/package.i18n.json @@ -69,7 +69,7 @@ "cmake-tools.command.cmake.debugTargetAll.title": "Déboguer tous les projets", "cmake-tools.command.cmake.launchTarget.title": "Exécuter sans débogage", "cmake-tools.command.cmake.launchTargetAll.title": "Exécuter tous les projets sans débogage", - "cmake-tools.command.cmake.selectLaunchTarget.title": "Définir la cible de débogage", + "cmake-tools.command.cmake.selectLaunchTarget.title": "Définir une cible de débogage/lancement", "cmake-tools.command.cmake.stop.title": "Annuler la build", "cmake-tools.command.cmake.stopAll.title": "Annuler la génération de tous les projets", "cmake-tools.command.cmake.resetState.title": "Réinitialiser l'état de l'extension CMake Tools (pour la résolution des problèmes)", @@ -108,6 +108,7 @@ "cmake-tools.configuration.cmake.ctest.parallelJobs.markdownDescription": "Nombre de travaux de test parallèles. Utilisez zéro pour utiliser la valeur de `#cmake.parallelJobs#`. Cela s’applique uniquement lorsque `#cmake.ctest.allowParallelJobs#` a la valeur `true`.", "cmake-tools.configuration.cmake.ctest.allowParallelJobs.description": "Permet l’exécution de ctests en parallèle, mais la sortie du résultat peut être tronquée et l’Explorateur de tests peut ne pas refléter précisément la progression du test.", "cmake-tools.configuration.cmake.ctest.testExplorerIntegrationEnabled.description": "Indique si l’intégration avec l’Explorateur de tests est activée. Cette option est utile pour la désactivation si vous préférez utiliser une autre extension pour l’intégration de test.", + "cmake-tools.configuration.cmake.ctest.testSuiteDelimiter.markdownDescription": "Délimiteur facultatif utilisé pour séparer les noms de suite de tests et les tests de groupe hiérarchiquement dans l’Explorateur de tests. Cette chaîne est utilisée dans une expression régulière, de sorte que certains délimiteurs peuvent nécessiter une séquence d’échappement. Exemples : `-` ( Un délimiteur : `-`), `\\.|::` (deux délimiteurs : `.` ou `::`. Notez que `.` doit être placé dans une séquence d’échappement.)", "cmake-tools.configuration.cmake.parseBuildDiagnostics.description": "Analyse la sortie du compilateur à la recherche d'avertissements et d'erreurs.", "cmake-tools.configuration.cmake.enabledOutputParsers.description": "Analyseurs de sortie à utiliser. Analyseurs `cmake`, `gcc`, `gnuld` pris en charge pour les sorties d'éditeurs de liens de style GNULD, `msvc` pour Microsoft Visual C++, `ghs` pour le compilateur Green Hills avec --no_wrap_diagnostics --brief_diagnostics et `diab` pour le compilateur Wind River Diab.", "cmake-tools.configuration.cmake.debugConfig.description": "Configuration Debug à utiliser au moment du débogage d'une cible.", @@ -132,6 +133,7 @@ "cmake-tools.configuration.cmake.debugConfig.setupCommands.description.description": "Description de la commande.", "cmake-tools.configuration.cmake.defaultVariants.overall.description": "Configurez les paramètres de variante par défaut.", "cmake-tools.configuration.cmake.defaultVariants.buildType.description": "Type de build.", + "cmake-tools.configuration.cmake.defaultVariants.buildType.unspecified.long": "Laissez CMake choisir le type de build par défaut.", "cmake-tools.configuration.cmake.defaultVariants.buildType.debug.long": "Désactiver les optimisations - Inclure les informations de débogage.", "cmake-tools.configuration.cmake.defaultVariants.buildType.release.long": "Optimiser pour la vitesse - Exclure les informations de débogage.", "cmake-tools.configuration.cmake.defaultVariants.buildType.minsize.long": "Optimiser pour la plus petite taille binaire - Exclure les informations de débogage.", @@ -153,6 +155,7 @@ "cmake-tools.configuration.cmake.copyCompileCommands.description": "Copie compile_commands.json à cet emplacement après une configuration réussie.", "cmake-tools.configuration.cmake.configureOnOpen.description": "Configure automatiquement les répertoires de projet CMake quand ils s'ouvrent.", "cmake-tools.configuration.cmake.configureOnEdit.description": "Configurez automatiquement les répertoires de projet CMake pendant l'enregistrement du contenu de cmake.sourceDirectory ou CMakeLists.txt.", + "cmake-tools.configuration.cmake.deleteBuildDirOnCleanConfigure.description": "Supprimez l’intégralité du répertoire de build quand une nouvelle configuration est appelée.", "cmake-tools.configuration.cmake.setBuildTypeOnMultiConfig.description": "Définissez CMAKE_BUILD_TYPE également sur les générateurs multi-config.", "cmake-tools.configuration.cmake.skipConfigureIfCachePresent.description": "Ignorez le processus de configuration si le cache est présent.", "cmake-tools.configuration.cmake.cmakeCommunicationMode": "Le protocole utilisé pour communiquer entre l'extension et CMake.", @@ -196,8 +199,10 @@ "cmake-tools.configuration.cmake.revealLog.focus.description": "Le journal apparaît et le canal de sortie prend le focus sur le curseur.", "cmake-tools.configuration.cmake.revealLog.always.description": "Le journal apparaît mais le canal de sortie ne prend pas le focus sur le curseur.", "cmake-tools.configuration.cmake.revealLog.never.description": "Le journal n’apparaît ni ne prend le focus.", + "cmake-tools.configuration.cmake.revealLog.onError.description": "Le journal apparaît uniquement en cas d’échec de la build ou de la configuration.", "cmake-tools.configuration.cmake.exportCompileCommandsFile.description": "Permet l'exportation de compile_commands.json. Cette option est utilisée uniquement dans les scénarios Kits. Dans les scénarios de préréglages, veuillez définir cela à l'aide de CMakePresets.json", "cmake-tools.configuration.cmake.useCMakePresets.description": "Utilisez CMakePresets.json pour configurer la configuration du lecteur CMake, son build et son test. Lorsque vous utilisez CMakePresets.json, les kits, les variantes et certains paramètres de settings.json seront ignorés.", + "cmake-tools.configuration.cmake.useVsDeveloperEnvironment.description": "Lors de l’utilisation de présélections CMake sur Windows, utilisez l’environnement Visual Studio comme environnement parent. La sélection de l’option automatique applique uniquement l’environnement Visual Studio lorsque nous détectons un compilateur pris en charge (cl, clang, clang-cl, clang-cpp, clang++) ou en cas d’utilisation du générateur Ninja.", "cmake-tools.configuration.cmake.allowCommentsInPresetsFile.description": "Autoriser l’utilisation d’extensions JSON telles que des commentaires dans CMakePresets.jsactivé. Notez que votre CMakePresets.jssur le fichier peut être considérée comme non valide par d’autres IDE ou sur la ligne de commande si vous utilisez un JSON non standard.", "cmake-tools.configuration.cmake.allowUnsupportedPresetsVersions.description": "Active l’utilisation de fichiers prédéfinies qui utilisent des fonctionnalités des versions que l’extension CMake Tools ne prend pas en charge actuellement. Les propriétés et macros inconnues seront ignorées.", "cmake-tools.configuration.cmake.ignoreCMakeListsMissing.description": "Si la valeur est `true`, l’extension ne demande pas à l’utilisateur de sélectionner un fichier CMakeLists.txt pour la configuration lorsqu’un fichier est trouvé dans l’espace de travail mais pas dans le dossier racine.", diff --git a/i18n/fra/src/cmake/cmakeExecutable.i18n.json b/i18n/fra/src/cmake/cmakeExecutable.i18n.json new file mode 100644 index 000000000..fc50e5d5f --- /dev/null +++ b/i18n/fra/src/cmake/cmakeExecutable.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "cmake.exe.not.found.in.cache": "Nous n’avons pas trouvé l’exécutable CMake dans le cache. Nouvelle vérification." +} \ No newline at end of file diff --git a/i18n/fra/src/cmakeProject.i18n.json b/i18n/fra/src/cmakeProject.i18n.json index 8f2f5a55d..f52e851b5 100644 --- a/i18n/fra/src/cmakeProject.i18n.json +++ b/i18n/fra/src/cmakeProject.i18n.json @@ -101,6 +101,7 @@ "options.configureWithDebuggerOnFail.do.not.show": "Ne plus afficher", "configure.failed.tryWithDebugger": "Échec de la configuration. Voulez-vous essayer de configurer avec le débogueur CMake ?", "no.configureWithDebugger.button": "Annuler", + "cmake.debug.name": "Débogueur CMake", "finishing.configure": "Fin de la configuration", "configure.failed": "Échec de configuration du projet", "saving.open.files.before": "Enregistrement des fichiers ouverts avant la configuration/la build", diff --git a/i18n/fra/src/ctest.i18n.json b/i18n/fra/src/ctest.i18n.json index f435370cc..c7132766b 100644 --- a/i18n/fra/src/ctest.i18n.json +++ b/i18n/fra/src/ctest.i18n.json @@ -9,10 +9,10 @@ "no.project.found": "Projet introuvable pour le dossier {0}", "no.driver.found": "Pilote introuvable pour le dossier {0}", "ctest.args.not.found": "Impossible d’obtenir les arguments de test", + "test.results.not.found": "Résultats des tests introuvables.", "test.failed.with.exit.code": "Échec du test {0} avec le code de sortie {1}.", "test.failed.with.completion.status": "Échec du test {0} avec l’état d’achèvement « {1} ».", "test.failed": "Échec du test {0}. Pour plus d’informations, consultez la sortie.", - "test.results.not.found": "Résultats des tests introuvables.", "ctest.run.terminated": "Exécution de CTest terminée", "ctest.finished.with.code": "CTest s'est achevé avec le code de retour {0}", "folder.not.found.in.test.explorer": "Dossier introuvable dans l’Explorateur de tests : {0}", diff --git a/i18n/fra/src/drivers/cmakeFileApiDriver.i18n.json b/i18n/fra/src/drivers/cmakeFileApiDriver.i18n.json index df651fdc0..22211c7e2 100644 --- a/i18n/fra/src/drivers/cmakeFileApiDriver.i18n.json +++ b/i18n/fra/src/drivers/cmakeFileApiDriver.i18n.json @@ -7,7 +7,6 @@ "creating.instance.of": "Création de l'instance de {0}", "removing": "Suppression de {0}", "unlink.failed": "Échec de la suppression du fichier cache {0}", - "cmake.debug.name": "Débogueur CMake", "toolchains.object.unsupported": "Cette version de CMake ne prend pas en charge les objets du genre \"chaîne d'outils\". Les chemins du compilateur sont déterminés par la lecture de CMakeCache.txt.", "build.all.target": "Cible spéciale pour générer toutes les cibles disponibles", "cmake.install.name": "Installer" diff --git a/i18n/fra/src/expand.i18n.json b/i18n/fra/src/expand.i18n.json index d40c9d4e3..4c184ee7b 100644 --- a/i18n/fra/src/expand.i18n.json +++ b/i18n/fra/src/expand.i18n.json @@ -4,11 +4,16 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "circular.variable.reference": "Référence de variable circulaire trouvée : {0}", + "circular.variable.reference.full": "Référence de variable circulaire trouvée : {0}", "reached.max.recursion": "La récursivité d’expansion de chaîne maximale a été atteinte. Référence circulaire possible.", - "exception.expanding.string": "Exception lors du développement de la chaîne {0} : {1}", - "invalid.variable.reference": "Référence de variable {0} non valide dans la chaîne {1}", + "max.recursion": "Récurrence d’expansion de chaîne max.", + "exception.expanding.string.full": "Exception lors du développement de la chaîne {0} : {1}", + "exception.expanding.string": "Exception du développement de la chaîne", + "invalid.variable.reference.full": "Référence de variable {0} non valide dans la chaîne {1}", + "invalid.variable.reference": "Référence de variable non valide", + "circular.variable.reference": "Référence de variable circulaire", "command.not.supported": "Les commandes ne sont pas prises en charge pour la chaîne : {0}", - "exception.executing.command": "Exception durant l'exécution de la commande {0} pour la chaîne : {1} {2}", + "exception.executing.command.full": "Exception durant l'exécution de la commande {0} pour la chaîne : {1} {2}", + "exception.executing.command": "Exception pendant l’exécution de la commande", "expand.expandstringhelper": "{0} étendu" } \ No newline at end of file diff --git a/i18n/fra/src/extension.i18n.json b/i18n/fra/src/extension.i18n.json index 120824b5c..76e3e0444 100644 --- a/i18n/fra/src/extension.i18n.json +++ b/i18n/fra/src/extension.i18n.json @@ -6,15 +6,6 @@ { "rereading.kits": "Relecture des kits", "dispose.cmake.tools": "Suppression de CMake Tools", - "configure.this.project": "Voulez-vous configurer le projet {0} ?", - "yes.button": "Oui", - "not.now.button": "Pas maintenant", - "always.configure.on.open": "Toujours configurer les projets à l'ouverture ?", - "never.configure.on.open": "Configurer les projets à l'ouverture ?", - "no.button": "Non", - "never.button": "Jamais", - "never.for.this.workspace.button": "Pas cet espace de travail", - "persist.config.on.open.setting": "Paramètre de persistance de la configuration à l'ouverture", "configuring.workspace.on.open": "Configuration de l'espace de travail à l'ouverture {0}", "configure.now.button": "Configurer maintenant", "configure.recommended": "Nous vous recommandons d'effectuer une reconfiguration après avoir mis à niveau la définition des kits.", @@ -35,6 +26,7 @@ "skip.set.workflow.preset": "À l’aide de kits, ignorez la définition de la présélection de workflow : {0}", "no.active.cmake.project": "Aucun projet CMake actif.", "invalid.folder": "Dossier non valide.", + "cmake.debug.name": "Débogueur CMake", "select.a.cmake.project": "Sélectionner un projet cmake", "compilation information.not.found": "Les informations de compilation sont introuvables pour ce fichier", "add.config.preset.in.test.mode": "Exécution de CMakeTools en mode test. addConfigurePreset est désactivé.", diff --git a/i18n/fra/src/preset.i18n.json b/i18n/fra/src/preset.i18n.json index 6c65b401d..391dcb818 100644 --- a/i18n/fra/src/preset.i18n.json +++ b/i18n/fra/src/preset.i18n.json @@ -18,25 +18,30 @@ "default.workflow.preset": "[Par défaut]", "default.workflow.preset.description": "Présélection de workflow vide qui n’ajoute aucun argument", "circular.inherits.in.config.preset": "Les héritages circulaires sont hérités dans la configuration prédéfinie {0}", - "binaryDir.undefined": "Configurer les prédéfinies {0} : Aucun répertoire binaire spécifié, en utilisant la valeur par défaut {1}", - "no.cl.arch": "Présélection de configuration {0} : aucune architecture spécifiée pour cl.exe, utilisation de x86 par défaut", + "no.cl.arch": "Configurer la présélection {0} : aucune architecture spécifiée pour cl.exe, utilisation de {1} par défaut", "no.cl.toolset.arch": "Présélection de configuration {0} : aucune architecture d’ensemble d’outils spécifiée pour cl.exe, utilisation de {1} par défaut", "invalid.cl.toolset.arch": "Configurer la présélection {0}: architecture d’ensemble d’outils inattendue spécifiée {1}, voulez-vous dire {2} ?", "no.cl.toolset.version": "Configurer la présélection {0} : aucune version de l’ensemble d’outils spécifiée pour cl.exe, utilisation de la dernière version par défaut", "unknown.toolset.option": "L’option d’ensemble d’outils non reconnu sera ignorée : {0}", - "config.preset.not.found": "Présélection de la configuration introuvable avec le nom {0}", "specified.vs.not.found": "Configurer les {0} prédéfinies : Instance Visual Studio spécifiée par {1} est introuvable, ce qui revient au comportement de recherche d’instance par défaut.", "specified.cl.not.found": "Configurer la présélection {0} : La compilation {1} avec le jeu d'outils {2} et l'architecture {3} n'a pas été trouvé, vous devrez peut-être exécuter la commande 'CMake : Scan for Compilers' si ce jeu d'outils existe sur votre ordinateur.", + "vs.not.found": "Configurer la présélection {0} : aucune installation de Visual Studio prenant en charge l’ensemble d’outils spécifié {1} et l’architecture {2} n’a été trouvé. Vous devrez peut-être exécuter la commande « CMake: Scan for Compilers » (« CMake : rechercher des compilateurs ») si cet ensemble d’outils existe sur votre ordinateur.", "using.vs.instance": "Utilisation de l’environnement de développement à partir de Visual Studio (instance {0}, version {1}, installé sur {2})", "ninja.not.set": "Ninja n’est pas défini sur PATH, tentative d’utilisation de {0}", + "config.preset.not.found.full": "Présélection de la configuration introuvable avec le nom {0}", + "config.preset.not.found": "Présélection de la configuration introuvable", "property.unsupported.v2": "Configurer les prédéfinies {0} : la Propriété {1} n’est pas prise en charge dans les présélections v2.", + "binaryDir.undefined": "Configurer les prédéfinies {0} : Aucun répertoire binaire spécifié, en utilisant la valeur par défaut {1}", "circular.inherits.in.build.preset": "Les héritages circulaires sont hérités dans la build prédéfinie {0}", "circular.inherits.in.test.preset": "Les héritages circulaires dans les {0} de test prédéfinis", "circular.inherits.in.package.preset": "Héritages circulaires dans la présélection de package {0}", "circular.inherits.in.workflow.preset": "Héritages circulaires dans la présélection de workflow {0}", - "build.preset.not.found": "Impossible de trouver une préselection de build avec le nom {0}", - "test.preset.not.found": "Impossible de trouver une présélection de test nommée {0}", - "package.preset.not.found": "Impossible de trouver la présélection de package nommée {0}", + "build.preset.not.found.full": "Impossible de trouver une préselection de build avec le nom {0}", + "build.preset.not.found": "Impossible de trouver une préselection de build", + "test.preset.not.found.full": "Impossible de trouver une présélection de test nommée {0}", + "test.preset.not.found": "Impossible de trouver la présélection de test", + "package.preset.not.found.full": "Impossible de trouver la présélection de package nommée {0}", + "package.preset.not.found": "Impossible de trouver le package", "workflow.preset.not.found": "Impossible de trouver la présélection de workflow nommée {0}", "clean.not.needed.no.prior.config.preset": "Nettoyage non nécessaire : aucune présélection de configuration antérieure sélectionnée", "clean.needed.config.preset.changed": "Nettoyage requis : présélection de configuration modifiée" diff --git a/i18n/fra/src/presetsController.i18n.json b/i18n/fra/src/presetsController.i18n.json index ab840f964..826b2d05b 100644 --- a/i18n/fra/src/presetsController.i18n.json +++ b/i18n/fra/src/presetsController.i18n.json @@ -25,6 +25,9 @@ "user.cancelled.compiler.selection": "Sélection du compilateur annulée par l’utilisateur", "user.selected.compiler": "L'utilisateur a sélectionné le compilateur {0}", "select.one.or.more.config.preset.placeholder": "Sélectionner une ou plusieurs présélections de configuration", + "custom.configure.preset.toolchain.file": "Configurer la présélection en tirant parti du fichier de chaîne d’outils", + "description.custom.configure.preset": "Permet de définir le générateur Ninja, la génération et l’installation du répertoire", + "custom.configure.preset": "Présélection de configuration personnalisée", "user.selected.config.preset": "L’utilisateur a sélectionné la présélection de configuration {0}", "yes": "Oui", "no": "Non", @@ -112,8 +115,12 @@ "reading.presets.file": "Lecture des fichiers de présélections {0}", "failed.to.parse": "Échec de l'analyse de {0} : {1}", "included.presets.file.not.found": "Le fichier de présélections inclus {0} est introuvable.", + "expanding.presets.file": "Développement des fichiers de présélections {0}", + "expansion.errors": "Erreurs d’extension trouvées dans le fichier de présélections.", + "successfully.expanded.presets.file": "Développement réussi du fichier de présélections {0}", "validating.presets.file": "Lecture et validation du « fichier {0}» des présélections", "unsupported.presets": "Présélections non prises en charge détectées dans {0}. La prise en charge est limitée aux fonctionnalités définies par la version {1}.", + "no.additional.properties": "ne doit PAS avoir de propriétés supplémentaires", "unsupported.presets.disable": "Les propriétés et macros inconnues peuvent être ignorées à l’aide du paramètre {0}.", "duplicate.build.preset.found": "Doublons trouvés dans la collection de présélections de build : « {0} »", "duplicate.test.preset.found": "Doublons trouvés dans la collection de présélections de test : « {0} »", @@ -121,9 +128,10 @@ "duplicate.workflow.preset.found": "Doublons trouvés dans la collection de présélections de workflow : « {0} »", "workflow.does.not.start.configure.step": "La présélection de workflow « {0} » ne commence pas par une étape de configuration.", "workflow.has.subsequent.configure.preset": "La présélection de workflow « {0} » a une autre présélection de configuration « {1} » en plus de la première étape « {2} » : ", - "successfully.validated.presets": "Les kits de présélections validés dans {0}", + "successfully.validated.presets": "Validation réussie de {0} par rapport au schéma de présélections", "use.kits.variants": "Utiliser des kits et des variantes", "edit.presets": "Localiser", "presets.version.error": "La version 1 de CMakePresets n’est pas prise en charge. Comment voulez-vous procéder ?", - "failed.writing.to.file": "L'écriture dans le fichier {0} a échoué" + "failed.writing.to.file": "L'écriture dans le fichier {0} a échoué", + "failed.to.watch": "Impossible de créer l’observateur pour {0} : {1}" } \ No newline at end of file diff --git a/i18n/fra/src/projectStatus.i18n.json b/i18n/fra/src/projectStatus.i18n.json index 8b2fabd76..3f7cb6aa7 100644 --- a/i18n/fra/src/projectStatus.i18n.json +++ b/i18n/fra/src/projectStatus.i18n.json @@ -24,8 +24,16 @@ "Launch": "Lancer", "Folder": "Dossier", "active.folder": "Dossier actif", + "configPreset.change": "Modifier la présélection de configuration", + "override.settings.applied": "Les paramètres de remplacement sont appliqués", + "buildPreset.change": "Modifier la présélection de build", + "testPreset.change": "Modifier la présélection de test", + "packagePreset.change": "Modifier la présélection de package", + "workflowPreset.change": "Modifier la présélection de flux de travail", + "kit.change": "Modifier le kit", "set.build.target": "Définir la cible de build", "set.debug.target": "Définir la cible de débogage", "set.launch.target": "Définir la cible de lancement", - "select.active.folder": "Sélectionnez le dossier actif" + "select.active.folder": "Sélectionnez le dossier actif", + "set.variant": "Définir une variante" } \ No newline at end of file diff --git a/i18n/fra/src/variant.i18n.json b/i18n/fra/src/variant.i18n.json index 25ca03070..ac635813f 100644 --- a/i18n/fra/src/variant.i18n.json +++ b/i18n/fra/src/variant.i18n.json @@ -9,6 +9,7 @@ "enable.optimizations.omit.debug": "Activer les optimisations, omettre les informations de débogage", "optimize.for.smallest": "Optimiser pour la plus petite taille de fichier binaire", "optimize.and.debug": "Effectuer les optimisations ET inclure les informations de débogage", + "unspec.build.type": "Laisser CMake choisir le type de build par défaut", "constructing": "Construction de {0}", "reloading.variants.file": "Rechargement du fichier de variantes {0}", "reloading.variants.from.settings": "Rechargement des variantes à partir des paramètres", diff --git a/i18n/ita/package.i18n.json b/i18n/ita/package.i18n.json index 7c730b246..4f03f268c 100644 --- a/i18n/ita/package.i18n.json +++ b/i18n/ita/package.i18n.json @@ -69,7 +69,7 @@ "cmake-tools.command.cmake.debugTargetAll.title": "Esegui debug di tutti i progetti", "cmake-tools.command.cmake.launchTarget.title": "Esegui senza debug", "cmake-tools.command.cmake.launchTargetAll.title": "Esegui tutti i progetti senza eseguire il debug", - "cmake-tools.command.cmake.selectLaunchTarget.title": "Imposta la destinazione di debug", + "cmake-tools.command.cmake.selectLaunchTarget.title": "Imposta destinazione di avvio/debug", "cmake-tools.command.cmake.stop.title": "Annulla compilazione", "cmake-tools.command.cmake.stopAll.title": "Annulla la compilazione per tutti i progetti", "cmake-tools.command.cmake.resetState.title": "Reimposta lo stato dell'estensione di CMake Tools (per la risoluzione dei problemi)", @@ -108,6 +108,7 @@ "cmake-tools.configuration.cmake.ctest.parallelJobs.markdownDescription": "Numero di processi di test paralleli. Usa zero per usare il valore di `#cmake.parallelJobs#`. Si applica solo quando `#cmake.ctest.allowParallelJobs#` è impostato su `true`.", "cmake-tools.configuration.cmake.ctest.allowParallelJobs.description": "Consente di eseguire i ctest in parallelo, ma l'output dei risultati potrebbe essere illeggibile ed Esplora test potrebbe non riflettere accuratamente l'avanzamento del test.", "cmake-tools.configuration.cmake.ctest.testExplorerIntegrationEnabled.description": "Indica se l'integrazione con Esplora test è abilitata o meno. È utile disabilitare questa opzione se si preferisce usare un'estensione diversa per l'integrazione dei test.", + "cmake-tools.configuration.cmake.ctest.testSuiteDelimiter.markdownDescription": "Delimitatore facoltativo usato per separare gerarchicamente i nomi dei gruppi di test e i test dei gruppi in Editor elenco dei test. Questa stringa viene usata in un'espressione regolare, di conseguenza alcuni delimitatori potrebbero richiedere escape. Esempi: `-` ( Un delimitatore: `-`), `\\.|::` (Due delimitatori: `.` o `::`. Si noti che `.` deve essere preceduto da un carattere di escape).", "cmake-tools.configuration.cmake.parseBuildDiagnostics.description": "Analizza l'output del compilatore per individuare avvisi ed errori.", "cmake-tools.configuration.cmake.enabledOutputParsers.description": "Parser di output da usare. Analizzatori supportati: `cmake`, `gcc`, `gnuld` per l'output del linker di tipo GNULD, `msvc` per Microsoft Visual C++, `ghs` per il compilatore Green Hills con --no_wrap_diagnostics --brief_diagnostics e `diab` per il compilatore Wind River Diab.", "cmake-tools.configuration.cmake.debugConfig.description": "Configurazione di debug da usare quando si esegue il debug di una destinazione.", @@ -132,6 +133,7 @@ "cmake-tools.configuration.cmake.debugConfig.setupCommands.description.description": "Descrizione del comando.", "cmake-tools.configuration.cmake.defaultVariants.overall.description": "Configurare le impostazioni delle varianti predefinite.", "cmake-tools.configuration.cmake.defaultVariants.buildType.description": "Tipo di compilazione.", + "cmake-tools.configuration.cmake.defaultVariants.buildType.unspecified.long": "Consenti a CMake di selezionare il tipo di build predefinito.", "cmake-tools.configuration.cmake.defaultVariants.buildType.debug.long": "Disabilita le ottimizzazioni - include le informazioni di debug.", "cmake-tools.configuration.cmake.defaultVariants.buildType.release.long": "Ottimizza per la velocità - esclude le informazioni di debug.", "cmake-tools.configuration.cmake.defaultVariants.buildType.minsize.long": "Ottimizza per ridurre le dimensioni del file binario - esclude le informazioni di debug.", @@ -153,6 +155,7 @@ "cmake-tools.configuration.cmake.copyCompileCommands.description": "Copia compile_commands.json in questa posizione dopo una configurazione riuscita.", "cmake-tools.configuration.cmake.configureOnOpen.description": "Configura automaticamente le directory di progetto di CMake quando vengono aperte.", "cmake-tools.configuration.cmake.configureOnEdit.description": "Configura automaticamente le directory del progetto CMake quando si salva cmake.sourceDirectory o il contenuto di CMakeLists.txt.", + "cmake-tools.configuration.cmake.deleteBuildDirOnCleanConfigure.description": "Eliminare l’intera directory di compilazione quando viene richiamata una configurazione pulita.", "cmake-tools.configuration.cmake.setBuildTypeOnMultiConfig.description": "Imposta CMAKE_BUILD_TYPE anche su generatori di configurazione multipla.", "cmake-tools.configuration.cmake.skipConfigureIfCachePresent.description": "Ignora il processo di configurazione se la cache è presente.", "cmake-tools.configuration.cmake.cmakeCommunicationMode": "Protocollo usato per le comunicazioni tra l'estensione e CMake.", @@ -196,8 +199,10 @@ "cmake-tools.configuration.cmake.revealLog.focus.description": "Il log viene visualizzato e il canale di output assume lo stato attivo del cursore.", "cmake-tools.configuration.cmake.revealLog.always.description": "Il log viene visualizzato, ma il canale di output non assume lo stato attivo del cursore.", "cmake-tools.configuration.cmake.revealLog.never.description": "Il log non viene visualizzato né assume lo stato attivo.", + "cmake-tools.configuration.cmake.revealLog.onError.description": "Il log viene visualizzato solo quando la compilazione o la configurazione non riesce.", "cmake-tools.configuration.cmake.exportCompileCommandsFile.description": "Consente l'esportazione di compile_commands.json. Questa opzione viene usata solo negli scenari di kit. Negli scenari di set di impostazioni, impostarlo usando CMakePresets.json", "cmake-tools.configuration.cmake.useCMakePresets.description": "Usare CMakePresets.json per configurare l’unità CMake di configurazione, compilazione e test. Quando si usa CMakePresets.json alcuni kit, varianti e impostazioni in settings.json verranno ignorati.", + "cmake-tools.configuration.cmake.useVsDeveloperEnvironment.description": "Quando si usano set di impostazioni di CMake in Windows, usare l'ambiente Visual Studio come ambiente principale. La selezione automatica applicherà l'ambiente Visual Studio solo quando viene rilevato un compilatore supportato (cl, clang, clang-cl, clang-cpp, clang++) o quando viene usato il generatore Ninja.", "cmake-tools.configuration.cmake.allowCommentsInPresetsFile.description": "Consente l'uso di estensioni JSON come i commenti in CMakePresets.json. Si noti che il file CMakePresets.json potrebbe essere considerato non valido da altri IDE o dalla riga di comando se si usa JSON non standard.", "cmake-tools.configuration.cmake.allowUnsupportedPresetsVersions.description": "Consente di usare file di set di impostazioni che usano funzionalità delle versioni attualmente non supportate dall'estensione CMake Tools. Le proprietà e le macro sconosciute verranno ignorate.", "cmake-tools.configuration.cmake.ignoreCMakeListsMissing.description": "Se è `true`, l'estensione non richiederà all'utente di selezionare un file CMakeLists.txt per la configurazione quando ne viene trovato uno nell'area di lavoro ma non nella cartella radice.", diff --git a/i18n/ita/src/cmake/cmakeExecutable.i18n.json b/i18n/ita/src/cmake/cmakeExecutable.i18n.json new file mode 100644 index 000000000..289f3db8f --- /dev/null +++ b/i18n/ita/src/cmake/cmakeExecutable.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "cmake.exe.not.found.in.cache": "L’eseguibile CMake non è stato trovato nella cache. Nuovo controllo in corso." +} \ No newline at end of file diff --git a/i18n/ita/src/cmakeProject.i18n.json b/i18n/ita/src/cmakeProject.i18n.json index d7898871c..54c52d01f 100644 --- a/i18n/ita/src/cmakeProject.i18n.json +++ b/i18n/ita/src/cmakeProject.i18n.json @@ -101,6 +101,7 @@ "options.configureWithDebuggerOnFail.do.not.show": "Non visualizzare più questo messaggio", "configure.failed.tryWithDebugger": "Configurazione non riuscita. Vuoi provare a configurare con CMake Debugger?", "no.configureWithDebugger.button": "Annulla", + "cmake.debug.name": "CMake Debugger", "finishing.configure": "Completamento della configurazione", "configure.failed": "Non è stato possibile configurare il progetto", "saving.open.files.before": "Salvataggio dei file aperti prima della configurazione/compilazione", diff --git a/i18n/ita/src/ctest.i18n.json b/i18n/ita/src/ctest.i18n.json index 9d3eb90eb..969534e6a 100644 --- a/i18n/ita/src/ctest.i18n.json +++ b/i18n/ita/src/ctest.i18n.json @@ -9,10 +9,10 @@ "no.project.found": "Non sono stati trovati progetti per la cartella {0}", "no.driver.found": "Nessun driver trovato per la cartella {0}", "ctest.args.not.found": "Non è stato possibile ottenere gli argomenti di test", + "test.results.not.found": "Risultati del test non trovati.", "test.failed.with.exit.code": "Test {0} non riuscito con codice di uscita {1}.", "test.failed.with.completion.status": "Test {0} non riuscito con stato di completamento \"{1}\".", "test.failed": "Test {0} non riuscito. Per altre informazioni, controllare l'output.", - "test.results.not.found": "Risultati del test non trovati.", "ctest.run.terminated": "L'esecuzione di CTest è stata terminata", "ctest.finished.with.code": "CTest terminato. Codice restituito: {0}", "folder.not.found.in.test.explorer": "Cartella non trovata in Esplora test: {0}", diff --git a/i18n/ita/src/drivers/cmakeFileApiDriver.i18n.json b/i18n/ita/src/drivers/cmakeFileApiDriver.i18n.json index 2a8844b3d..ecc9db939 100644 --- a/i18n/ita/src/drivers/cmakeFileApiDriver.i18n.json +++ b/i18n/ita/src/drivers/cmakeFileApiDriver.i18n.json @@ -7,7 +7,6 @@ "creating.instance.of": "Creazione dell'istanza di {0}", "removing": "Rimozione di {0}", "unlink.failed": "Non è stato possibile rimuovere il file di cache {0}", - "cmake.debug.name": "CMake Debugger", "toolchains.object.unsupported": "Questa versione di CMake non supporta il tipo di oggetto \"toolchains\". Per determinare i percorsi del compilatore, verrà letto il file CMakeCache.txt.", "build.all.target": "Destinazione speciale per la compilazione di tutte le destinazioni disponibili", "cmake.install.name": "Installa" diff --git a/i18n/ita/src/expand.i18n.json b/i18n/ita/src/expand.i18n.json index d0ba96eba..eb7cda8a6 100644 --- a/i18n/ita/src/expand.i18n.json +++ b/i18n/ita/src/expand.i18n.json @@ -4,11 +4,16 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "circular.variable.reference": "Trovato riferimento alla variabile circolare: {0}", + "circular.variable.reference.full": "Trovato riferimento alla variabile circolare: {0}", "reached.max.recursion": "Ha raggiunto la ricorsione di espansione massima delle stringhe. Possibile riferimento circolare.", - "exception.expanding.string": "Eccezione durante l'espansione della stringa {0}: {1}", - "invalid.variable.reference": "Riferimento a variabile {0} non valido nella stringa: {1}", + "max.recursion": "Ricorsione massima di espansione della stringa", + "exception.expanding.string.full": "Eccezione durante l'espansione della stringa {0}: {1}", + "exception.expanding.string": "Eccezione stringa di espansione", + "invalid.variable.reference.full": "Riferimento a variabile {0} non valido nella stringa: {1}", + "invalid.variable.reference": "Riferimento variabile non valido", + "circular.variable.reference": "Riferimento a variabili circolari", "command.not.supported": "I comandi non sono supportati per la stringa: {0}", - "exception.executing.command": "Si è verificata un'eccezione durante l'esecuzione del comando {0} per la stringa: {1} {2}", + "exception.executing.command.full": "Si è verificata un'eccezione durante l'esecuzione del comando {0} per la stringa: {1} {2}", + "exception.executing.command": "Eccezione durante l'esecuzione del comando", "expand.expandstringhelper": "Espansa {0}" } \ No newline at end of file diff --git a/i18n/ita/src/extension.i18n.json b/i18n/ita/src/extension.i18n.json index 9ead29f3b..64aa1973e 100644 --- a/i18n/ita/src/extension.i18n.json +++ b/i18n/ita/src/extension.i18n.json @@ -6,15 +6,6 @@ { "rereading.kits": "Rilettura dei kit", "dispose.cmake.tools": "Eliminazione di CMake Tools", - "configure.this.project": "Configurare il progetto {0}?", - "yes.button": "Sì", - "not.now.button": "Non ora", - "always.configure.on.open": "Configurare sempre i progetti all'apertura?", - "never.configure.on.open": "Configurare i progetti all'apertura?", - "no.button": "No", - "never.button": "Mai", - "never.for.this.workspace.button": "Non questa area di lavoro", - "persist.config.on.open.setting": "Rendi permanente l'impostazione di configurazione all'apertura", "configuring.workspace.on.open": "Configurazione dell'area di lavoro all'apertura di {0}", "configure.now.button": "Configura ora", "configure.recommended": "È consigliabile riconfigurare dopo l'aggiornamento a una nuova definizione dei kit.", @@ -35,6 +26,7 @@ "skip.set.workflow.preset": "Usando i kit, ignora la configurazione del set di impostazioni del flusso di lavoro: {0}", "no.active.cmake.project": "Nessun progetto CMake attivo.", "invalid.folder": "La cartella non è valida.", + "cmake.debug.name": "CMake Debugger", "select.a.cmake.project": "Seleziona un progetto CMake", "compilation information.not.found": "Non è possibile trovare le informazioni di compilazione per questo file", "add.config.preset.in.test.mode": "Esecuzione di CMakeTools in modalità di test. addConfigurePreset è disabilitato.", diff --git a/i18n/ita/src/preset.i18n.json b/i18n/ita/src/preset.i18n.json index cc8e09af9..3722c8e55 100644 --- a/i18n/ita/src/preset.i18n.json +++ b/i18n/ita/src/preset.i18n.json @@ -18,25 +18,30 @@ "default.workflow.preset": "[Impostazione predefinita]", "default.workflow.preset.description": "Set di impostazioni del flusso di lavoro vuoto che non aggiunge argomenti", "circular.inherits.in.config.preset": "Istruzione inherits circolare nel set di impostazioni di configurazione {0}", - "binaryDir.undefined": "Set di impostazioni di configurazione {0}: nessun valore binaryDir specificato. Verrà usato il valore predefinito {1}", - "no.cl.arch": "Preset di configurazione {0}: nessuna architettura specificata per cl.exe con x86 per impostazione predefinita", + "no.cl.arch": "Set di impostazioni di configurazione {0}: non è stata specificata alcuna architettura per cl.exe. Per impostazione predefinita, verrà usata {1}", "no.cl.toolset.arch": "Set di impostazioni di configurazione {0}: non è stata specificata alcuna architettura del set di strumenti per cl.exe. Per impostazione predefinita, verrà usata {1}", "invalid.cl.toolset.arch": "Set di impostazioni di configurazione {0}: È stata specificata un'architettura imprevista per il set di strumenti {1}. Si intendeva {2}?", "no.cl.toolset.version": "Preset di configurazione {0}: nessuna versione del set di strumenti specificata per cl.exe con l’ultima versione per impostazione predefinita", "unknown.toolset.option": "L'opzione del set di strumenti non riconosciuta verrà ignorata: {0}", - "config.preset.not.found": "Non è stato possibile trovare il set di impostazioni di configurazione denominato {0}", "specified.vs.not.found": "Set di impostazioni di configurazione {0}: l'istanza di Visual Studio specificata da {1} non è stata trovata. Verrà eseguito il fallback al comportamento di ricerca predefinito dell'istanza.", "specified.cl.not.found": "Set di impostazioni di configurazione {0}: il compilatore {1} con il set di strumenti {2} e l’architettura {3} non sono stati trovati, potrebbe essere necessario eseguire 'CMake: ricerca compilatori' per controllare l’esistenza sul tuo computer.", + "vs.not.found": "Set di impostazioni di configurazione {0}: non è stata trovata alcuna installazione di Visual Studio che supporti il set di strumenti {1} e l'architettura specificati {2}. Potrebbe essere necessario eseguire 'CMake: ricerca compilatori' per controllare l’esistenza sul tuo computer.", "using.vs.instance": "Uso dell'ambiente di sviluppo da Visual Studio (istanza {0}, versione {1}, installato in {2})", "ninja.not.set": "Ninja non è impostato su PATH, provare a usare {0}", + "config.preset.not.found.full": "Non è stato possibile trovare il set di impostazioni di configurazione denominato {0}", + "config.preset.not.found": "Non è stato possibile trovare il set di impostazioni di configurazione", "property.unsupported.v2": "Set di impostazioni di configurazione {0}: la proprietà {1} non è supportata nei set di impostazioni v2", + "binaryDir.undefined": "Set di impostazioni di configurazione {0}: nessun valore binaryDir specificato. Verrà usato il valore predefinito {1}", "circular.inherits.in.build.preset": "Istruzione inherits circolare nel set di impostazioni di compilazione {0}", "circular.inherits.in.test.preset": "Istruzione inherits circolare nel set di impostazioni di test {0}", "circular.inherits.in.package.preset": "Ereditarietà circolari nel set di impostazioni del pacchetto {0}", "circular.inherits.in.workflow.preset": "Ereditarietà circolari nel set di impostazioni del flusso di lavoro {0}", - "build.preset.not.found": "Non è stato possibile trovare il set di impostazioni di compilazione denominato {0}", - "test.preset.not.found": "Non è stato possibile trovare il set di impostazioni di test denominato {0}", - "package.preset.not.found": "Non è possibile trovare il set di impostazioni del pacchetto con il nome {0}", + "build.preset.not.found.full": "Non è stato possibile trovare il set di impostazioni di compilazione denominato {0}", + "build.preset.not.found": "Non è stato possibile trovare il set di impostazioni di compilazione", + "test.preset.not.found.full": "Non è stato possibile trovare il set di impostazioni di test denominato {0}", + "test.preset.not.found": "Non è stato possibile trovare il set di impostazioni di test", + "package.preset.not.found.full": "Non è possibile trovare il set di impostazioni del pacchetto con il nome {0}", + "package.preset.not.found": "Impossibile trovare il set di impostazioni del pacchetto", "workflow.preset.not.found": "Non è stato possibile trovare il set di impostazioni del flusso di lavoro con nome {0}", "clean.not.needed.no.prior.config.preset": "Pulizia non necessaria: nessun set di impostazioni di configurazione precedente selezionato", "clean.needed.config.preset.changed": "Pulizia necessaria: il set di impostazioni di configurazione è stato modificato" diff --git a/i18n/ita/src/presetsController.i18n.json b/i18n/ita/src/presetsController.i18n.json index a1ca3cefd..4423e8e95 100644 --- a/i18n/ita/src/presetsController.i18n.json +++ b/i18n/ita/src/presetsController.i18n.json @@ -25,6 +25,9 @@ "user.cancelled.compiler.selection": "Selezione del compilatore annullata dall’utente", "user.selected.compiler": "Compilatore {0} selezionato dall’utente", "select.one.or.more.config.preset.placeholder": "Selezionare una o più set di impostazioni di configurazione", + "custom.configure.preset.toolchain.file": "Configura il set di impostazioni usando il file toolchain", + "description.custom.configure.preset": "Imposta il generatore Ninja, compila e installa la directory", + "custom.configure.preset": "Set di impostazioni di configurazione personalizzato", "user.selected.config.preset": "Utente ha selezionato il set di impostazioni di configurazione {0}", "yes": "Sì", "no": "No", @@ -112,8 +115,12 @@ "reading.presets.file": "Lettura dei file dei set di impostazioni {0}", "failed.to.parse": "Non è stato possibile analizzare {0}: {1}", "included.presets.file.not.found": "Impossibile trovare il file dei set di impostazioni inclusi {0}", + "expanding.presets.file": "Espansione del file dei set di impostazioni {0}", + "expansion.errors": "Errori di espansione rilevati nel file dei set di impostazioni.", + "successfully.expanded.presets.file": "Il file dei set di impostazioni è stato espanso {0}", "validating.presets.file": "Lettura e convalida dei set di impostazioni \"file {0}\"", "unsupported.presets": "Sono stati rilevati set di impostazioni non supportati in {0}. Il supporto è limitato alle funzionalità definite dalla versione {1}.", + "no.additional.properties": "NON deve avere proprietà aggiuntive", "unsupported.presets.disable": "Le proprietà e le macro sconosciute possono essere ignorate usando l'impostazione {0}.", "duplicate.build.preset.found": "Sono stati trovati duplicati all'interno della raccolta di set di impostazioni di compilazione: \"{0}\"", "duplicate.test.preset.found": "Sono stati trovati duplicati all'interno della raccolta set di impostazioni test: \"{0}\"", @@ -121,9 +128,10 @@ "duplicate.workflow.preset.found": "Sono stati trovati duplicati all'interno della raccolta di set di impostazioni del flusso di lavoro: \"{0}\"", "workflow.does.not.start.configure.step": "Il set di impostazioni del flusso di lavoro \"{0}\" non inizia con un passaggio di configurazione.", "workflow.has.subsequent.configure.preset": "Il set di impostazioni del flusso di lavoro \"{0}\" ha un altro set di impostazioni di configurazione \"{1}\" oltre al primo passaggio \"{2}\": ", - "successfully.validated.presets": "I set di impostazioni sono stati convalidati correttamente in {0}", + "successfully.validated.presets": "Convalida dei {0} sullo schema dei set di impostazioni completata", "use.kits.variants": "Usare kit e varianti", "edit.presets": "Individuare", "presets.version.error": "CMakePresets versione 1 non è supportato. Come si vuole procedere?", - "failed.writing.to.file": "Non è stato possibile scrivere nel file {0}" + "failed.writing.to.file": "Non è stato possibile scrivere nel file {0}", + "failed.to.watch": "Non è stato possibile creare Watcher per {0}: {1}" } \ No newline at end of file diff --git a/i18n/ita/src/projectStatus.i18n.json b/i18n/ita/src/projectStatus.i18n.json index 9e7b2d2ba..5a2bf45c1 100644 --- a/i18n/ita/src/projectStatus.i18n.json +++ b/i18n/ita/src/projectStatus.i18n.json @@ -24,8 +24,16 @@ "Launch": "Avvia", "Folder": "Cartella", "active.folder": "Cartella attiva", + "configPreset.change": "Cambia set di impostazioni di configurazione", + "override.settings.applied": "Impostazioni di override applicate", + "buildPreset.change": "Cambia set di impostazioni di compilazione", + "testPreset.change": "Cambia set di impostazioni di test", + "packagePreset.change": "Cambia set di impostazioni del pacchetto", + "workflowPreset.change": "Cambia set di impostazioni del flusso di lavoro", + "kit.change": "Cambia kit", "set.build.target": "Imposta la destinazione di compilazione", "set.debug.target": "Imposta la destinazione di debug", "set.launch.target": "Impostare destinazione di avvio", - "select.active.folder": "Seleziona la cartella attiva" + "select.active.folder": "Seleziona la cartella attiva", + "set.variant": "Imposta variante" } \ No newline at end of file diff --git a/i18n/ita/src/variant.i18n.json b/i18n/ita/src/variant.i18n.json index 20d2679a2..67d8b42bd 100644 --- a/i18n/ita/src/variant.i18n.json +++ b/i18n/ita/src/variant.i18n.json @@ -9,6 +9,7 @@ "enable.optimizations.omit.debug": "Abilita le ottimizzazioni e omette le informazioni di debug", "optimize.for.smallest": "Ottimizza per ridurre le dimensioni del file binario", "optimize.and.debug": "Esegui le ottimizzazioni E includi le informazioni di debug", + "unspec.build.type": "Consenti a CMake di selezionare il tipo di build predefinito", "constructing": "Costruzione di {0}", "reloading.variants.file": "Ricaricamento del file delle varianti {0}", "reloading.variants.from.settings": "Ricaricamento delle varianti dalle impostazioni", diff --git a/i18n/jpn/package.i18n.json b/i18n/jpn/package.i18n.json index cfc1cb904..c7b9fdec8 100644 --- a/i18n/jpn/package.i18n.json +++ b/i18n/jpn/package.i18n.json @@ -69,7 +69,7 @@ "cmake-tools.command.cmake.debugTargetAll.title": "すべてのプロジェクトのデバッグ", "cmake-tools.command.cmake.launchTarget.title": "デバッグなしで実行", "cmake-tools.command.cmake.launchTargetAll.title": "デバッグなしですべてのプロジェクトを実行", - "cmake-tools.command.cmake.selectLaunchTarget.title": "デバッグ ターゲットの設定", + "cmake-tools.command.cmake.selectLaunchTarget.title": "起動/デバッグ ターゲットの設定", "cmake-tools.command.cmake.stop.title": "ビルドをキャンセル", "cmake-tools.command.cmake.stopAll.title": "すべてのプロジェクトのビルドをキャンセル", "cmake-tools.command.cmake.resetState.title": "CMake Tools 拡張機能の状態をリセットする (トラブルシューティング用)", @@ -108,6 +108,7 @@ "cmake-tools.configuration.cmake.ctest.parallelJobs.markdownDescription": "並列テスト ジョブの数。`#cmake.parallelJobs#` の値を使用するには、0 を使用します。これは、`#cmake.ctest.allowParallelJobs#` が `true` に設定されている場合にのみ適用されます。", "cmake-tools.configuration.cmake.ctest.allowParallelJobs.description": "ctest を並列で実行できますが、結果として結果出力が文字化けし、テスト エクスプローラーにテストの進行状況が正確に反映されない場合があります。", "cmake-tools.configuration.cmake.ctest.testExplorerIntegrationEnabled.description": "テスト エクスプローラーとの統合が有効になっているかどうか。テスト統合に別の拡張機能を使用する場合には、これを無効にすることが適しています。", + "cmake-tools.configuration.cmake.ctest.testSuiteDelimiter.markdownDescription": "テスト エクスプローラーでテスト スイート名とグループ テストを階層的に区切るために使用される省略可能な区切り記号。この文字列は正規表現で使用されるため、一部の区切り記号ではエスケープが必要になる場合があります。例: `-` (1 つの区切り記号: `-`)、`\\.|::` (2 つの区切り記号: `.` または `::`。`.` はエスケープする必要があることに注意してください)。", "cmake-tools.configuration.cmake.parseBuildDiagnostics.description": "コンパイラ出力の警告とエラーを解析します。", "cmake-tools.configuration.cmake.enabledOutputParsers.description": "使用する出力パーサー。サポートされるパーサーは、GNULD スタイルのリンカー出力の場合は `cmake`、`gcc`、`gnuld`、Microsoft Visual C++ の場合は `msvc`、--no_wrap_diagnostics --brief_diagnostics を指定した Green Hills Compiler の場合は `ghs`、Wind River Diab Compiler の場合は `diab` です。", "cmake-tools.configuration.cmake.debugConfig.description": "ターゲットのデバッグ時に使用するデバッグ構成です。", @@ -132,6 +133,7 @@ "cmake-tools.configuration.cmake.debugConfig.setupCommands.description.description": "コマンドの説明です。", "cmake-tools.configuration.cmake.defaultVariants.overall.description": "既定のバリアント設定を構成します。", "cmake-tools.configuration.cmake.defaultVariants.buildType.description": "ビルドの種類です。", + "cmake-tools.configuration.cmake.defaultVariants.buildType.unspecified.long": "CMake が既定のビルドの種類を選択するようにします。", "cmake-tools.configuration.cmake.defaultVariants.buildType.debug.long": "最適化の無効化 - デバッグ情報を含めます。", "cmake-tools.configuration.cmake.defaultVariants.buildType.release.long": "速度を最適化 - デバッグ情報を除外します。", "cmake-tools.configuration.cmake.defaultVariants.buildType.minsize.long": "最小のバイナリ サイズ用に最適化 - デバッグ情報を除外します。", @@ -153,6 +155,7 @@ "cmake-tools.configuration.cmake.copyCompileCommands.description": "構成が正常に完了したら、compile_commands.json をこの場所にコピーします。", "cmake-tools.configuration.cmake.configureOnOpen.description": "CMake プロジェクト ディレクトリを開いたときに自動的に構成します。", "cmake-tools.configuration.cmake.configureOnEdit.description": "cmake.sourceDirectory または CMakeLists.txt のコンテンツの保存時に、CMake プロジェクトのディレクトリを自動的に構成します。", + "cmake-tools.configuration.cmake.deleteBuildDirOnCleanConfigure.description": "クリーン構成が呼び出されたときに、ビルド ディレクトリ全体を削除します。", "cmake-tools.configuration.cmake.setBuildTypeOnMultiConfig.description": "マルチ構成ジェネレーターでも CMAKE_BUILD_TYPE を設定します。", "cmake-tools.configuration.cmake.skipConfigureIfCachePresent.description": "キャッシュが存在する場合は、構成プロセスをスキップします。", "cmake-tools.configuration.cmake.cmakeCommunicationMode": "拡張機能と CMake の間の通信に使用されるプロトコル。", @@ -196,8 +199,10 @@ "cmake-tools.configuration.cmake.revealLog.focus.description": "ログが表示され、出力チャネルがカーソル フォーカスを取得します。", "cmake-tools.configuration.cmake.revealLog.always.description": "ログが表示されますが、出力チャネルはカーソル フォーカスを取得しません。", "cmake-tools.configuration.cmake.revealLog.never.description": "ログは表示もされず、フォーカスも取得しません。", + "cmake-tools.configuration.cmake.revealLog.onError.description": "ログは、ビルドまたは構成が失敗した場合にのみ表示されます。", "cmake-tools.configuration.cmake.exportCompileCommandsFile.description": "compile_commands.json のエクスポートを有効にします。これは、Kits シナリオでのみ使用されます。Presets シナリオでは、CMakePresets.json を使用してこれを設定してください", "cmake-tools.configuration.cmake.useCMakePresets.description": "CMakePresets.json を使用して、ドライブ CMake の構成、ビルド、テストを構成します。CMakePresets.json を使用している場合、キット、バリエーション、また settings.json の設定の一部は無視されます。", + "cmake-tools.configuration.cmake.useVsDeveloperEnvironment.description": "Windows で CMake プリセットを使用する場合は、Visual Studio 環境を親環境として使用します。自動を選択すると、サポートされているコンパイラ (cl、clang、clang-cl、clang-cpp、clang++) が検出されたとき、または Ninja ジェネレーターが使用されている場合にのみ、Visual Studio 環境が適用されます。", "cmake-tools.configuration.cmake.allowCommentsInPresetsFile.description": "CMakePresets.json でコメントなどの JSON 拡張機能の使用を許可します。標準以外の JSON を使用した場合、他の IDE やコマンド ラインで CMakePresets.json ファイルが無効とみなされる可能性があることに注意してください。", "cmake-tools.configuration.cmake.allowUnsupportedPresetsVersions.description": "CMake Tools 拡張機能が現在サポートしていないバージョンの機能を使用しているプリセット ファイルの使用を有効にします。不明なプロパティとマクロは無視されます。", "cmake-tools.configuration.cmake.ignoreCMakeListsMissing.description": "`true` の場合、拡張機能は、ワークスペース内で見つかったがルート フォルダーにない場合に、構成用の CMakeLists.txt ファイルを選択するようにユーザーに求めなくなります。", diff --git a/i18n/jpn/src/cmake/cmakeExecutable.i18n.json b/i18n/jpn/src/cmake/cmakeExecutable.i18n.json new file mode 100644 index 000000000..b1c966aab --- /dev/null +++ b/i18n/jpn/src/cmake/cmakeExecutable.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "cmake.exe.not.found.in.cache": "CMake 実行可能ファイルがキャッシュで見つかりません。もう一度確認しています。" +} \ No newline at end of file diff --git a/i18n/jpn/src/cmakeProject.i18n.json b/i18n/jpn/src/cmakeProject.i18n.json index a4468c3ce..ef25b9fdb 100644 --- a/i18n/jpn/src/cmakeProject.i18n.json +++ b/i18n/jpn/src/cmakeProject.i18n.json @@ -101,6 +101,7 @@ "options.configureWithDebuggerOnFail.do.not.show": "再表示しない", "configure.failed.tryWithDebugger": "構成に失敗しました。CMake デバッガーを使用して構成しますか?", "no.configureWithDebugger.button": "キャンセル", + "cmake.debug.name": "CMake デバッガー", "finishing.configure": "構成を終了しています", "configure.failed": "プロジェクトを構成できませんでした", "saving.open.files.before": "構成またはビルドの前に、開いているファイルを保存しています", diff --git a/i18n/jpn/src/ctest.i18n.json b/i18n/jpn/src/ctest.i18n.json index c6aae1557..912831f3d 100644 --- a/i18n/jpn/src/ctest.i18n.json +++ b/i18n/jpn/src/ctest.i18n.json @@ -9,10 +9,10 @@ "no.project.found": "フォルダー {0} のプロジェクトが見つかりません", "no.driver.found": "フォルダー {0} のドライバーが見つかりません", "ctest.args.not.found": "テスト引数を取得できませんでした", + "test.results.not.found": "テスト結果が見つかりません。", "test.failed.with.exit.code": "テスト {0} が終了コード {1} で失敗しました。", "test.failed.with.completion.status": "テスト {0} が完了状態 \"{1}\" で失敗しました。", "test.failed": "テスト {0} に失敗しました。詳細については、出力を確認してください。", - "test.results.not.found": "テスト結果が見つかりません。", "ctest.run.terminated": "CTest の実行が終了しました", "ctest.finished.with.code": "CTest がリターン コード {0} で終了しました", "folder.not.found.in.test.explorer": "フォルダーがテスト エクスプローラーに見つかりません: {0}", diff --git a/i18n/jpn/src/drivers/cmakeFileApiDriver.i18n.json b/i18n/jpn/src/drivers/cmakeFileApiDriver.i18n.json index 2ce930058..ca0bedd7c 100644 --- a/i18n/jpn/src/drivers/cmakeFileApiDriver.i18n.json +++ b/i18n/jpn/src/drivers/cmakeFileApiDriver.i18n.json @@ -7,7 +7,6 @@ "creating.instance.of": "{0} のインスタンスを作成しています", "removing": "{0} の削除", "unlink.failed": "キャッシュ ファイル {0} を削除できませんでした", - "cmake.debug.name": "CMake デバッガー", "toolchains.object.unsupported": "このバージョンの CMake では、\"ツールチェーン\" オブジェクトの種類はサポートされていません。コンパイラのパスは、CMakeCache.txt を読み取ることによって決まります。", "build.all.target": "すべての使用可能なターゲットをビルドする特別なターゲット", "cmake.install.name": "インストール" diff --git a/i18n/jpn/src/expand.i18n.json b/i18n/jpn/src/expand.i18n.json index e4bbb21e0..09637fc3d 100644 --- a/i18n/jpn/src/expand.i18n.json +++ b/i18n/jpn/src/expand.i18n.json @@ -4,11 +4,16 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "circular.variable.reference": "循環変数参照が見つかりました: {0}", + "circular.variable.reference.full": "循環変数参照が見つかりました: {0}", "reached.max.recursion": "文字列展開の再帰の最大数に達しました。循環参照の可能性があります。", - "exception.expanding.string": "文字列 {0} の展開中に例外が発生しました: {1}", - "invalid.variable.reference": "文字列に無効な変数参照 {0} があります: {1}", + "max.recursion": "文字列展開の再帰の最大数", + "exception.expanding.string.full": "文字列 {0} の展開中に例外が発生しました: {1}", + "exception.expanding.string": "例外拡張文字列", + "invalid.variable.reference.full": "文字列に無効な変数参照 {0} があります: {1}", + "invalid.variable.reference": "無効な変数参照", + "circular.variable.reference": "循環変数参照", "command.not.supported": "コマンドは文字列ではサポートされていません: {0}", - "exception.executing.command": "文字列に対してコマンド {0} を実行中に例外が発生しました: {1} {2}", + "exception.executing.command.full": "文字列に対してコマンド {0} を実行中に例外が発生しました: {1} {2}", + "exception.executing.command": "コマンドの実行中に例外が発生しました", "expand.expandstringhelper": "{0} を展開しました" } \ No newline at end of file diff --git a/i18n/jpn/src/extension.i18n.json b/i18n/jpn/src/extension.i18n.json index d4fce28de..b4d4cf583 100644 --- a/i18n/jpn/src/extension.i18n.json +++ b/i18n/jpn/src/extension.i18n.json @@ -6,15 +6,6 @@ { "rereading.kits": "キットを再読み取りしています", "dispose.cmake.tools": "CMake Tools の破棄", - "configure.this.project": "プロジェクト {0} を構成しますか?", - "yes.button": "はい", - "not.now.button": "今はしない", - "always.configure.on.open": "プロジェクトを開いたときに常に構成しますか?", - "never.configure.on.open": "プロジェクトを開くときに構成しますか?", - "no.button": "いいえ", - "never.button": "なし", - "never.for.this.workspace.button": "このワークスペースではありません", - "persist.config.on.open.setting": "開いたときに構成する設定を保持する", "configuring.workspace.on.open": "開いている {0} 上でワークスペースを構成しています", "configure.now.button": "今すぐ構成", "configure.recommended": "新しいキット定義にアップグレードした後に、再構成することをお勧めします。", @@ -35,6 +26,7 @@ "skip.set.workflow.preset": "キットを使用して、ワークフロー プリセットの設定をスキップします: {0}", "no.active.cmake.project": "アクティブな CMake プロジェクトがありません。", "invalid.folder": "無効なフォルダーです。", + "cmake.debug.name": "CMake デバッガー", "select.a.cmake.project": "cmake プロジェクトの選択", "compilation information.not.found": "このファイルのコンパイル情報が見つかりません", "add.config.preset.in.test.mode": "CMakeTools はテスト モードで実行されています。addConfigurePreset が無効になります。", diff --git a/i18n/jpn/src/preset.i18n.json b/i18n/jpn/src/preset.i18n.json index 829dcaf85..eab7deedc 100644 --- a/i18n/jpn/src/preset.i18n.json +++ b/i18n/jpn/src/preset.i18n.json @@ -18,25 +18,30 @@ "default.workflow.preset": "[既定]", "default.workflow.preset.description": "引数を追加しない空のワークフロー プリセット", "circular.inherits.in.config.preset": "構成プリセット {0} での循環継承", - "binaryDir.undefined": "プリセット {0} の構成: binaryDir が指定されていません。既定値 {1} を使用しています", - "no.cl.arch": "構成の事前設定 {0}: 既定では x86 を使用する、cl.exe のアーキテクチャが指定されていません", + "no.cl.arch": "構成の事前設定 {0}: cl.exe のアーキテクチャが指定されていない、既定では {1} を使用します", "no.cl.toolset.arch": "構成の事前設定 {0}: 既定では {1} を使用する、cl.exe のツールセット アーキテクチャが指定されていません", "invalid.cl.toolset.arch": "構成の事前設定 {0}: 予期しないツールセット アーキテクチャ {1} が指定されています。{2} ですか?", "no.cl.toolset.version": "構成の事前設定 {0}: cl.exe に対してツールセットのバージョンが指定されていません。既定で最新を使用しています", "unknown.toolset.option": "認識できないツールセット オプションは無視されます: {0}", - "config.preset.not.found": "名前が {0} の構成の事前設定を見つけることができませんでした", "specified.vs.not.found": "事前設定 {0} を構成する: {1} で指定された Visual Studio インスタンスが見つからず、既定のインスタンスを参照する動作にフォールバックします。", "specified.cl.not.found": "構成の事前設定 {0}: ツールセット {2} およびアーキテクチャ {3} を使用するコンパイラ {1} が見つかりませんでした。このツールセットがコンピューターに存在する場合は、CMake: Scan for Compilers コマンドを実行する必要がある場合があります。", + "vs.not.found": "構成の事前設定 {0}: 指定されたツールセット {1} とアーキテクチャ {2} をサポートする Visual Studio インストールが見つかりませんでした。このツールセットがコンピューターに存在する場合は、'CMake: コンパイラをスキャンする' コマンドを実行する必要がある場合があります。", "using.vs.instance": "Visual Studio から開発者環境を使用 (インスタンス {0}、バージョン {1}、{2} にインストール)", "ninja.not.set": "Ninja は PATH に設定されていません。 {0} を使用しようとしています", + "config.preset.not.found.full": "名前が {0} の構成の事前設定を見つけることができませんでした", + "config.preset.not.found": "構成プリセットが見つかりませんでした", "property.unsupported.v2": "プリセット {0} の構成: プロパティ {1} はプリセット v2 ではサポートされていません", + "binaryDir.undefined": "プリセット {0} の構成: binaryDir が指定されていません。既定値 {1} を使用しています", "circular.inherits.in.build.preset": "ビルド プリセット {0} での循環継承", "circular.inherits.in.test.preset": "テスト プリセット {0} での循環継承", "circular.inherits.in.package.preset": "パッケージ プリセット {0} での循環継承", "circular.inherits.in.workflow.preset": "ワークフロー プリセット {0} での循環継承", - "build.preset.not.found": "名前が {0} のビルドの事前設定が見つかりませんでした", - "test.preset.not.found": "名前が {0} のテストの事前設定が見つかりませんでした", - "package.preset.not.found": "名前が {0} のパッケージ プリセットが見つかりませんでした", + "build.preset.not.found.full": "名前が {0} のビルドの事前設定が見つかりませんでした", + "build.preset.not.found": "ビルド プリセットが見つかりませんでした", + "test.preset.not.found.full": "名前が {0} のテストの事前設定が見つかりませんでした", + "test.preset.not.found": "テスト プリセットが見つかりませんでした。", + "package.preset.not.found.full": "名前が {0} のパッケージ プリセットが見つかりませんでした", + "package.preset.not.found": "パッケージ プリセットが見つかりませんでした。", "workflow.preset.not.found": "名前が {0} のワークフロー プリセットが見つかりませんでした", "clean.not.needed.no.prior.config.preset": "クリーンは不要: 構成の事前設定が選択されていない", "clean.needed.config.preset.changed": "クリーンが必要: 構成の事前設定が変更された" diff --git a/i18n/jpn/src/presetsController.i18n.json b/i18n/jpn/src/presetsController.i18n.json index c3d76a736..8427c6839 100644 --- a/i18n/jpn/src/presetsController.i18n.json +++ b/i18n/jpn/src/presetsController.i18n.json @@ -25,6 +25,9 @@ "user.cancelled.compiler.selection": "ユーザーがコンパイラの選択を取り消しました", "user.selected.compiler": "ユーザーがコンパイラ {0} を選択しました", "select.one.or.more.config.preset.placeholder": "1 つ以上の構成の事前設定を選択してください", + "custom.configure.preset.toolchain.file": "ツールチェーン ファイルを使用してプリセットを構成する", + "description.custom.configure.preset": "Ninja ジェネレーター、ビルド、インストール ディレクトリを設定します", + "custom.configure.preset": "カスタム構成のプリセット", "user.selected.config.preset": "ユーザーが構成の事前設定 {0} を選択しました", "yes": "はい", "no": "いいえ", @@ -112,8 +115,12 @@ "reading.presets.file": "事前設定ファイル {0} を読み取っています", "failed.to.parse": "{0} を解析できませんでした: {1}", "included.presets.file.not.found": "含まれているプリセット ファイル {0} が見つかりません", + "expanding.presets.file": "プリセット ファイル {0} を展開中", + "expansion.errors": "プリセット ファイルで拡張エラーが見つかりました。", + "successfully.expanded.presets.file": "プリセット ファイル {0} が正常に展開されました", "validating.presets.file": "プリセット \"ファイル {0}\" を読み取り、検証しています", "unsupported.presets": "サポートされていないプリセットが {0} で検出されました。サポートは、バージョン {1} で定義されている機能に制限されています。", + "no.additional.properties": "追加のプロパティを含めることはできません", "unsupported.presets.disable": "{0} 設定を使用すると、不明なプロパティとマクロを無視できます。", "duplicate.build.preset.found": "ビルド プリセット コレクション内に重複が見つかりました: \"{0}\"", "duplicate.test.preset.found": "テストのプリセット コレクション内に重複が見つかりました: \"{0}\"", @@ -121,9 +128,10 @@ "duplicate.workflow.preset.found": "ワークフロー プリセット コレクション内に重複が見つかりました: \"{0}\"", "workflow.does.not.start.configure.step": "ワークフロー プリセット \"{0}\" が構成ステップで開始されません。", "workflow.has.subsequent.configure.preset": "ワークフロー プリセット \"{0}\" には、最初のステップ \"{2}\" に加えて、別の構成プリセット \"{1}\" があります: ", - "successfully.validated.presets": "{0} の事前設定が正常に検証されました", + "successfully.validated.presets": "プリセット スキーマに対する {0} が正常に検証されました", "use.kits.variants": "キットとバリアントを使用する", "edit.presets": "検索", "presets.version.error": "CMakePresets バージョン 1 はサポートされていません。続行する方法を選択してください。", - "failed.writing.to.file": "ファイル {0} への書き込みが失敗しました" + "failed.writing.to.file": "ファイル {0} への書き込みが失敗しました", + "failed.to.watch": "{0} のウォッチャーを作成できませんでした。{1}" } \ No newline at end of file diff --git a/i18n/jpn/src/projectStatus.i18n.json b/i18n/jpn/src/projectStatus.i18n.json index 6fec87e0b..3de8eb906 100644 --- a/i18n/jpn/src/projectStatus.i18n.json +++ b/i18n/jpn/src/projectStatus.i18n.json @@ -24,8 +24,16 @@ "Launch": "起動", "Folder": "フォルダー", "active.folder": "アクティブなフォルダー", + "configPreset.change": "構成のプリセットの変更", + "override.settings.applied": "オーバーライド設定が適用されました", + "buildPreset.change": "ビルド プリセットの変更", + "testPreset.change": "テスト プリセットの変更", + "packagePreset.change": "パッケージ プリセットの変更", + "workflowPreset.change": "ワークフロー プリセットの変更", + "kit.change": "キットの変更", "set.build.target": "ビルド ターゲットの設定", "set.debug.target": "デバッグ ターゲットの設定", "set.launch.target": "起動ターゲットの設定", - "select.active.folder": "アクティブなフォルダーの選択" + "select.active.folder": "アクティブなフォルダーの選択", + "set.variant": "バリアントの設定" } \ No newline at end of file diff --git a/i18n/jpn/src/variant.i18n.json b/i18n/jpn/src/variant.i18n.json index 0d5563d85..5e3dd01b3 100644 --- a/i18n/jpn/src/variant.i18n.json +++ b/i18n/jpn/src/variant.i18n.json @@ -9,6 +9,7 @@ "enable.optimizations.omit.debug": "最適化を有効にし、デバッグ情報を省略する", "optimize.for.smallest": "最小バイナリ サイズの最適化", "optimize.and.debug": "最適化を実行し、かつデバッグ情報を含める", + "unspec.build.type": "CMake が既定のビルドの種類を選択するようにする", "constructing": "{0} を構築しています", "reloading.variants.file": "バリアント ファイル {0} を再度読み込んでいます", "reloading.variants.from.settings": "設定からバリアントを再度読み込んでいます", diff --git a/i18n/kor/package.i18n.json b/i18n/kor/package.i18n.json index d28b90034..6a0950922 100644 --- a/i18n/kor/package.i18n.json +++ b/i18n/kor/package.i18n.json @@ -69,7 +69,7 @@ "cmake-tools.command.cmake.debugTargetAll.title": "모든 프로젝트 디버그", "cmake-tools.command.cmake.launchTarget.title": "디버깅하지 않고 실행", "cmake-tools.command.cmake.launchTargetAll.title": "디버깅하지 않고 모든 프로젝트 실행", - "cmake-tools.command.cmake.selectLaunchTarget.title": "디버그 대상 설정", + "cmake-tools.command.cmake.selectLaunchTarget.title": "시작/디버그 대상 설정", "cmake-tools.command.cmake.stop.title": "빌드 취소", "cmake-tools.command.cmake.stopAll.title": "모든 프로젝트의 빌드 취소", "cmake-tools.command.cmake.resetState.title": "CMake 도구 확장 상태 다시 설정(문제 해결용)", @@ -108,6 +108,7 @@ "cmake-tools.configuration.cmake.ctest.parallelJobs.markdownDescription": "병렬 테스트 작업 수입니다. `#cmake.parallelJobs#` 값을 사용하려면 0을 사용합니다. 이는 `#cmake.ctest.allowParallelJobs#`이 `true`로 설정된 경우에만 적용됩니다.", "cmake-tools.configuration.cmake.ctest.allowParallelJobs.description": "Ctest를 병렬로 실행할 수 있지만 그로 인해 결과 출력이 왜곡될 수 있으며 테스트 탐색기에 테스트 진행 상황이 정확하게 반영되지 않을 수 있습니다.", "cmake-tools.configuration.cmake.ctest.testExplorerIntegrationEnabled.description": "테스트 탐색기와의 통합을 사용할 수 있는지 여부입니다. 이는 테스트 통합에 다른 확장을 사용하려는 경우 사용하지 않도록 설정하는 데 유용합니다.", + "cmake-tools.configuration.cmake.ctest.testSuiteDelimiter.markdownDescription": "테스트 도구 모음 이름과 그룹 테스트를 테스트 탐색기에서 계층적으로 구분하는 데 사용되는 선택적 구분 기호입니다. 이 문자열은 정규식에서 사용되므로 일부 구분 기호는 이스케이프해야 할 수 있습니다. 예: `-`(1개의 구분 기호: `-`), `\\.|::`(두 개의 구분 기호: `.` 또는 `::`. `.`은 이스케이프해야 합니다.)", "cmake-tools.configuration.cmake.parseBuildDiagnostics.description": "경고 및 오류에 대한 컴파일러 출력을 구문 분석합니다.", "cmake-tools.configuration.cmake.enabledOutputParsers.description": "사용할 출력 파서입니다. 지원되는 파서: GNULD 스타일 링커 출력의 경우 `cmake`, `gcc`, `gnuld`, Microsoft Visual C++의 경우 `msvc`, Green Hills 컴파일러의 경우 `ghs`(--no_wrap_diagnostics --brief_diagnostics 포함), Wind River Diab 컴파일러의 경우 `diab`", "cmake-tools.configuration.cmake.debugConfig.description": "대상을 디버깅할 때 사용할 디버그 구성입니다.", @@ -132,6 +133,7 @@ "cmake-tools.configuration.cmake.debugConfig.setupCommands.description.description": "명령에 대한 설명입니다.", "cmake-tools.configuration.cmake.defaultVariants.overall.description": "기본 변형 설정을 구성합니다.", "cmake-tools.configuration.cmake.defaultVariants.buildType.description": "빌드 형식입니다.", + "cmake-tools.configuration.cmake.defaultVariants.buildType.unspecified.long": "CMake에서 기본 빌드 형식을 선택하도록 허용합니다.", "cmake-tools.configuration.cmake.defaultVariants.buildType.debug.long": "최적화 사용 안 함-디버그 정보를 포함합니다.", "cmake-tools.configuration.cmake.defaultVariants.buildType.release.long": "속도 최적화 - 디버그 정보를 제외합니다.", "cmake-tools.configuration.cmake.defaultVariants.buildType.minsize.long": "최소 이진 크기에 맞게 최적화 - 디버그 정보를 제외합니다.", @@ -153,6 +155,7 @@ "cmake-tools.configuration.cmake.copyCompileCommands.description": "구성에 성공한 후 compile_commands.json을 이 위치로 복사합니다.", "cmake-tools.configuration.cmake.configureOnOpen.description": "CMake 프로젝트 디렉터리를 열 때 자동으로 구성합니다.", "cmake-tools.configuration.cmake.configureOnEdit.description": "cmake.sourceDirectory 또는 CMakeLists.txt 콘텐츠가 저장될 때 CMake 프로젝트 디렉터리를 자동으로 구성합니다.", + "cmake-tools.configuration.cmake.deleteBuildDirOnCleanConfigure.description": "정리 구성이 호출될 때 전체 빌드 디렉터리를 삭제합니다.", "cmake-tools.configuration.cmake.setBuildTypeOnMultiConfig.description": "다중 구성 생성기에도 CMAKE_BUILD_TYPE를 설정합니다.", "cmake-tools.configuration.cmake.skipConfigureIfCachePresent.description": "캐시가 있으면 구성 프로세스를 건너뜁니다.", "cmake-tools.configuration.cmake.cmakeCommunicationMode": "확장과 CMake 간 통신에 사용되는 프로토콜입니다.", @@ -196,8 +199,10 @@ "cmake-tools.configuration.cmake.revealLog.focus.description": "로그가 나타나고 출력 채널이 커서 포커스를 받습니다.", "cmake-tools.configuration.cmake.revealLog.always.description": "로그가 나타나지만 출력 채널은 커서 포커스를 받지 않습니다.", "cmake-tools.configuration.cmake.revealLog.never.description": "로그가 나타나지도 않고 초점을 맞추지 않습니다.", + "cmake-tools.configuration.cmake.revealLog.onError.description": "로그는 빌드 또는 구성이 실패할 때만 나타납니다.", "cmake-tools.configuration.cmake.exportCompileCommandsFile.description": "compile_commands.json 내보내기를 사용하도록 설정합니다. 키트 시나리오에서만 사용됩니다. 사전 설정 시나리오에서는 CMakePresets.json을 사용하여 설정하세요.", "cmake-tools.configuration.cmake.useCMakePresets.description": "CMakePresets.json을 사용하여 드라이브 CMake 구성, 빌드 및 테스트를 구성합니다. CMakePresets.json을 사용할 때, 키트, 변형 및 settings.json의 일부 설정이 무시됩니다.", + "cmake-tools.configuration.cmake.useVsDeveloperEnvironment.description": "Windows에서 CMake 사전 설정을 사용할 때 Visual Studio 환경을 부모 환경으로 사용합니다. 자동을 선택하면 지원되는 컴파일러(cl, clang, clang-cl, clang-cpp, clang++)가 감지되거나 Ninja 생성기가 사용되고 있는 경우에만 Visual Studio 환경이 적용됩니다.", "cmake-tools.configuration.cmake.allowCommentsInPresetsFile.description": "CMakePresets.json의 설명과 같은 JSON 확장 사용을 허용합니다. CMakePresets.json 파일은 다른 IDE에서 또는 비표준 JSON을 사용하는 경우 명령줄에서 유효하지 않은 것으로 간주될 수 있습니다.", "cmake-tools.configuration.cmake.allowUnsupportedPresetsVersions.description": "CMake Tools 확장에서 현재 지원하지 않는 버전의 기능을 사용하는 사전 설정 파일을 사용하도록 설정합니다. 알 수 없는 속성 및 매크로는 무시됩니다.", "cmake-tools.configuration.cmake.ignoreCMakeListsMissing.description": "`true`이면 확장에서 작업 영역에 있지만 루트 폴더에는 없는 경우 구성을 위해 CMakeLists.txt 파일을 선택하도록 사용자에게 요청하지 않습니다.", diff --git a/i18n/kor/src/cmake/cmakeExecutable.i18n.json b/i18n/kor/src/cmake/cmakeExecutable.i18n.json new file mode 100644 index 000000000..5cfabdde1 --- /dev/null +++ b/i18n/kor/src/cmake/cmakeExecutable.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "cmake.exe.not.found.in.cache": "캐시에서 CMake 실행 파일을 찾을 수 없습니다. 다시 확인하는 중입니다." +} \ No newline at end of file diff --git a/i18n/kor/src/cmakeProject.i18n.json b/i18n/kor/src/cmakeProject.i18n.json index ad9407ca5..204b0af13 100644 --- a/i18n/kor/src/cmakeProject.i18n.json +++ b/i18n/kor/src/cmakeProject.i18n.json @@ -101,6 +101,7 @@ "options.configureWithDebuggerOnFail.do.not.show": "다시 표시 안 함", "configure.failed.tryWithDebugger": "구성하지 못했습니다. CMake 디버거를 사용하여 구성하시겠습니까?", "no.configureWithDebugger.button": "취소", + "cmake.debug.name": "CMake 디버거", "finishing.configure": "구성을 완료하는 중", "configure.failed": "프로젝트를 구성하지 못함", "saving.open.files.before": "구성/빌드하기 전에 열린 파일을 저장하는 중", diff --git a/i18n/kor/src/ctest.i18n.json b/i18n/kor/src/ctest.i18n.json index 22c9dec90..6dcf7b1b4 100644 --- a/i18n/kor/src/ctest.i18n.json +++ b/i18n/kor/src/ctest.i18n.json @@ -9,10 +9,10 @@ "no.project.found": "{0} 폴더에 대한 프로젝트를 찾을 수 없습니다.", "no.driver.found": "{0} 폴더에 대한 드라이버를 찾을 수 없습니다.", "ctest.args.not.found": "테스트 인수를 가져올 수 없습니다.", + "test.results.not.found": "테스트 결과를 찾을 수 없습니다.", "test.failed.with.exit.code": "종료 코드 {1}을(를) 반환하며 테스트 {0}에 실패했습니다.", "test.failed.with.completion.status": "완료 상태 \" {1} \"(으)로 테스트 {0}에 실패했습니다.", "test.failed": "테스트 {0}에 실패했습니다. 자세한 내용은 출력을 확인하세요.", - "test.results.not.found": "테스트 결과를 찾을 수 없습니다.", "ctest.run.terminated": "CTest 실행이 종료됨", "ctest.finished.with.code": "CTest 완료(반환 코드: {0})", "folder.not.found.in.test.explorer": "테스트 탐색기에서 폴더를 찾을 수 없습니다. {0}", diff --git a/i18n/kor/src/drivers/cmakeFileApiDriver.i18n.json b/i18n/kor/src/drivers/cmakeFileApiDriver.i18n.json index f44cf9718..06f1e5203 100644 --- a/i18n/kor/src/drivers/cmakeFileApiDriver.i18n.json +++ b/i18n/kor/src/drivers/cmakeFileApiDriver.i18n.json @@ -7,7 +7,6 @@ "creating.instance.of": "{0} 인스턴스를 만드는 중", "removing": "{0}을(를) 제거하는 중", "unlink.failed": "캐시 파일 {0}을(를) 제거하지 못함", - "cmake.debug.name": "CMake 디버거", "toolchains.object.unsupported": "이 CMake 버전은 \"도구 체인\" 개체 종류를 지원하지 않습니다. 컴파일러 경로는 CMakeCache.txt를 읽는 방법으로 결정됩니다.", "build.all.target": "사용 가능한 모든 대상을 빌드할 특수 대상", "cmake.install.name": "설치" diff --git a/i18n/kor/src/expand.i18n.json b/i18n/kor/src/expand.i18n.json index 83881d0f0..9bd452533 100644 --- a/i18n/kor/src/expand.i18n.json +++ b/i18n/kor/src/expand.i18n.json @@ -4,11 +4,16 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "circular.variable.reference": "순환 변수 참조 발견: {0}", + "circular.variable.reference.full": "순환 변수 참조 발견: {0}", "reached.max.recursion": "최대 문자열 확장 재귀에 도달했습니다. 순환 참조가 발생할 수 있습니다.", - "exception.expanding.string": "{0} 문자열 확장 중 예외 발생: {1}", - "invalid.variable.reference": "문자열의 잘못된 변수 참조 {0}: {1}", + "max.recursion": "최대 문자열 확장 재귀", + "exception.expanding.string.full": "{0} 문자열 확장 중 예외 발생: {1}", + "exception.expanding.string": "문자열 확장 예외", + "invalid.variable.reference.full": "문자열의 잘못된 변수 참조 {0}: {1}", + "invalid.variable.reference": "잘못된 변수 참조", + "circular.variable.reference": "순환 변수 참조", "command.not.supported": "문자열에 대해 명령이 지원되지 않음: {0}", - "exception.executing.command": "문자열에 대해 명령 {0}을(를) 실행하는 동안 예외 발생: {1} {2}", + "exception.executing.command.full": "문자열에 대해 명령 {0}을(를) 실행하는 동안 예외 발생: {1} {2}", + "exception.executing.command": "명령을 실행하는 동안 예외가 발생했습니다.", "expand.expandstringhelper": "{0} 확장됨" } \ No newline at end of file diff --git a/i18n/kor/src/extension.i18n.json b/i18n/kor/src/extension.i18n.json index b71ee16e2..d39b90a19 100644 --- a/i18n/kor/src/extension.i18n.json +++ b/i18n/kor/src/extension.i18n.json @@ -6,15 +6,6 @@ { "rereading.kits": "키트를 다시 읽는 중", "dispose.cmake.tools": "CMake 도구 삭제", - "configure.this.project": "{0} 프로젝트를 구성할까요?", - "yes.button": "예", - "not.now.button": "나중에", - "always.configure.on.open": "항상 프로젝트를 열 때 구성하시겠습니까?", - "never.configure.on.open": "프로젝트를 열 때 구성하시겠습니까?", - "no.button": "아니요", - "never.button": "안 함", - "never.for.this.workspace.button": "이 작업 영역이 아님", - "persist.config.on.open.setting": "config-on-open 설정 유지", "configuring.workspace.on.open": "열린 {0}에서 작업 영역을 구성하는 중", "configure.now.button": "지금 구성", "configure.recommended": "새 키트 정의로 업그레이드한 후 다시 구성하는 것이 좋습니다.", @@ -35,6 +26,7 @@ "skip.set.workflow.preset": "키트를 사용하여 워크플로 사전 설정 {0}을(를) 설정하는 작업 건너뛰기", "no.active.cmake.project": "활성 CMake 프로젝트가 없습니다.", "invalid.folder": "폴더가 잘못되었습니다.", + "cmake.debug.name": "CMake 디버거", "select.a.cmake.project": "Cmake 프로젝트 선택", "compilation information.not.found": "이 파일의 컴파일 정보를 찾을 수 없음", "add.config.preset.in.test.mode": "테스트 모드에서 CMakeTools를 실행 중입니다. addConfigurePreset 가 사용 중지되었습니다.", diff --git a/i18n/kor/src/preset.i18n.json b/i18n/kor/src/preset.i18n.json index 7c2599ecd..b78ef121c 100644 --- a/i18n/kor/src/preset.i18n.json +++ b/i18n/kor/src/preset.i18n.json @@ -18,25 +18,30 @@ "default.workflow.preset": "[기본값]", "default.workflow.preset.description": "인수를 추가하지 않는 빈 워크플로 사전 설정", "circular.inherits.in.config.preset": "사전 설정 구성에서 원형으로 배치가 상속됩니다. {0}", - "binaryDir.undefined": "구성 사전 설정 {0}: 기본값 {1}을(를) 사용하여 지정된 binaryDir이 없음", - "no.cl.arch": "구성 사전 설정 {0}: 기본적으로 x86을 사용하는 cl.exe에 대해 지정된 아키텍처가 없음", + "no.cl.arch": "미리 설정된 구성 {0}: cl.exe에 대해 지정된 아키텍처가 없으며 기본값으로 {1} 사용", "no.cl.toolset.arch": "미리 설정된 구성 {0}: 기본으로 {1}를 사용하여 cl.exe에 대해 지정된 도구 집합 아키텍처가 없음", "invalid.cl.toolset.arch": "구성 사전 설정 {0}: 예기치 않은 도구 집합 아키텍처가 {1}을(를) 지정했습니다. {2}인가요?", "no.cl.toolset.version": "구성 사전 설정 {0}: 기본적으로 최신 버전을 사용하는 cl.exe에 대해 지정된 도구 집합 버전이 없음", "unknown.toolset.option": "인식할 수 없는 도구 집합 옵션은 무시됩니다. {0}", - "config.preset.not.found": "이름이 {0}인 구성 사전 설정을 찾을 수 없음", "specified.vs.not.found": "사전 설정 {0} 구성: {1}에서 지정한 Visual Studio 인스턴스를 찾을 수 없으며 기본 인스턴스 조회 동작으로 대체됩니다.", "specified.cl.not.found": "구성 사전 설정 {0}: 도구 집합 {2} 및 아키텍처 {3}을(를) 사용하여 컴파일러 {1}을(를) 찾을 수 없습니다. 이 도구 집합이 컴퓨터에 있는 경우 'CMake: 컴파일러 검색' 명령을 실행해야 할 수 있습니다.", + "vs.not.found": "사전 설정 {0} 구성: 지정한 도구 집합 {1} 및 아키텍처 {2}을(를) 지원하는 Visual Studio 설치를 찾을 수 없습니다. 이 도구 집합이 컴퓨터에 있는 경우 'CMake: 컴파일러 검색' 명령을 실행해야 할 수 있습니다.", "using.vs.instance": "Visual Studio의 개발자 환경 사용({2}에 설치된 인스턴스 {0}, 버전 {1})", "ninja.not.set": "{0}을(를) 사용하려는 PATH에 Ninja가 설정되지 않음", + "config.preset.not.found.full": "이름이 {0}인 구성 사전 설정을 찾을 수 없음", + "config.preset.not.found": "구성 미리 설정을 찾을 수 없습니다.", "property.unsupported.v2": "구성 사전 설정 {0}: 속성 {1}은(는) 사전 설정 v2에서 지원되지 않음", + "binaryDir.undefined": "구성 사전 설정 {0}: 기본값 {1}을(를) 사용하여 지정된 binaryDir이 없음", "circular.inherits.in.build.preset": "빌드 사전 설정 {0}에서 원형으로 배치가 상속됩니다.", "circular.inherits.in.test.preset": "테스트 사전 설정 {0}에서 원형으로 배치가 상속됩니다.", "circular.inherits.in.package.preset": "패키지 사전 설정 {0}의 순환 상속", "circular.inherits.in.workflow.preset": "워크플로 사전 설정 {0}의 순환 상속", - "build.preset.not.found": "이름이 {0}인 빌드 사전 설정을 찾을 수 없음", - "test.preset.not.found": "이름이 {0}인 테스트 사전 설정을 찾을 수 없음", - "package.preset.not.found": "이름이 {0}인 패키지 사전 설정을 찾을 수 없음", + "build.preset.not.found.full": "이름이 {0}인 빌드 사전 설정을 찾을 수 없음", + "build.preset.not.found": "빌드 사전 설정을 찾을 수 없습니다.", + "test.preset.not.found.full": "이름이 {0}인 테스트 사전 설정을 찾을 수 없음", + "test.preset.not.found": "테스트 사전 설정을 찾을 수 없습니다.", + "package.preset.not.found.full": "이름이 {0}인 패키지 사전 설정을 찾을 수 없음", + "package.preset.not.found": "패키지 미리 설정을 찾을 수 없습니다.", "workflow.preset.not.found": "이름이 {0}인 워크플로 사전 설정을 찾을 수 없음", "clean.not.needed.no.prior.config.preset": "정리 필요 없음: 선택한 이전 구성 사전 설정 없음", "clean.needed.config.preset.changed": "정리 필요: 구성 사전 설정이 변경됨" diff --git a/i18n/kor/src/presetsController.i18n.json b/i18n/kor/src/presetsController.i18n.json index b4cb12bdd..e05bcb0c7 100644 --- a/i18n/kor/src/presetsController.i18n.json +++ b/i18n/kor/src/presetsController.i18n.json @@ -25,6 +25,9 @@ "user.cancelled.compiler.selection": "사용자가 컴파일러 선택을 취소", "user.selected.compiler": "사용자가 컴파일러 {0} 선택", "select.one.or.more.config.preset.placeholder": "하나 이상의 구성 사전 설정 선택", + "custom.configure.preset.toolchain.file": "도구 체인 파일을 사용하여 사전 설정 구성", + "description.custom.configure.preset": "Ninja 생성기, 빌드 및 설치 디렉터리 설정", + "custom.configure.preset": "사용자 지정 구성 사전 설정", "user.selected.config.preset": "사용자가 구성 사전 설정 {0} 선택", "yes": "예", "no": "아니요", @@ -112,8 +115,12 @@ "reading.presets.file": "사전 설정 파일 {0} 읽기", "failed.to.parse": "{0}을(를) 구문 분석하지 못함: {1}", "included.presets.file.not.found": "포함된 사전 설정 파일 {0}을(를) 찾을 수 없습니다.", + "expanding.presets.file": "미리 설정 파일 확장 {0}", + "expansion.errors": "사전 설정 파일에서 확장 오류가 발견되었습니다.", + "successfully.expanded.presets.file": "사전 설정 파일을 확장함 {0}", "validating.presets.file": "\"파일 {0}\" 사전 설정을 읽고 유효성을 검사하는 중", "unsupported.presets": "{0}에서 지원되지 않는 사전 설정이 검색되었습니다. 지원은 버전 {1}에서 정의한 기능으로 제한됩니다.", + "no.additional.properties": "추가 속성이 없어야 함", "unsupported.presets.disable": "알 수 없는 속성 및 매크로는 {0} 설정을 사용하여 무시할 수 있습니다.", "duplicate.build.preset.found": "빌드 사전 설정 컬렉션에서 중복 항목 발견: \"{0}\"", "duplicate.test.preset.found": "테스트 사전 설정 컬렉션에서 중복 항목 발견: \"{0}\"", @@ -121,9 +128,10 @@ "duplicate.workflow.preset.found": "워크플로 사전 설정 컬렉션에서 중복 항목 발견: \"{0}\"", "workflow.does.not.start.configure.step": "워크플로 사전 설정 \"{0}\"이(가) 구성 단계로 시작하지 않습니다.", "workflow.has.subsequent.configure.preset": "워크플로 사전 설정 \"{0}\"에 첫 번째 단계 \"{2}\" 외에 다른 구성 사전 설정 \"{1}\"이(가) 있습니다. ", - "successfully.validated.presets": "{0}에서 사전 설정의 유효성을 검사했습니다.", + "successfully.validated.presets": "사전 설정 스키마에 대해 {0}의 유효성을 검사했습니다.", "use.kits.variants": "키트 및 변형 사용", "edit.presets": "찾기", "presets.version.error": "CMakePresets 버전 1이 지원되지 않습니다. 계속 진행하시겠습니까?", - "failed.writing.to.file": "{0} 파일에 쓰지 못함" + "failed.writing.to.file": "{0} 파일에 쓰지 못함", + "failed.to.watch": "{0}에 감시자를 만들 수 없습니다.{1}" } \ No newline at end of file diff --git a/i18n/kor/src/projectStatus.i18n.json b/i18n/kor/src/projectStatus.i18n.json index efd2a5dd7..c5865ce6f 100644 --- a/i18n/kor/src/projectStatus.i18n.json +++ b/i18n/kor/src/projectStatus.i18n.json @@ -24,8 +24,16 @@ "Launch": "시작", "Folder": "폴더", "active.folder": "활성 폴더", + "configPreset.change": "사전 설정 구성 변경", + "override.settings.applied": "재정의 설정 적용됨", + "buildPreset.change": "빌드 사전 설정 변경", + "testPreset.change": "테스트 사전 설정 변경", + "packagePreset.change": "패키지 사전 설정 변경", + "workflowPreset.change": "워크플로 사전 설정 변경", + "kit.change": "키트 변경", "set.build.target": "빌드 대상 설정", "set.debug.target": "디버그 대상 설정", "set.launch.target": "시작 대상 설정", - "select.active.folder": "활성 폴더 선택" + "select.active.folder": "활성 폴더 선택", + "set.variant": "변형 설정" } \ No newline at end of file diff --git a/i18n/kor/src/variant.i18n.json b/i18n/kor/src/variant.i18n.json index 7319e7ac7..14204afd9 100644 --- a/i18n/kor/src/variant.i18n.json +++ b/i18n/kor/src/variant.i18n.json @@ -9,6 +9,7 @@ "enable.optimizations.omit.debug": "최적화 사용, 디버그 정보 생략", "optimize.for.smallest": "최소 이진 파일 크기에 최적화", "optimize.and.debug": "최적화 수행 및 디버깅 정보 포함", + "unspec.build.type": "CMake에서 기본 빌드 형식을 선택하도록 허용", "constructing": "{0}을(를) 생성하는 중", "reloading.variants.file": "variant 파일 {0}을(를) 다시 로드하는 중", "reloading.variants.from.settings": "설정에서 variant를 다시 로드하는 중", diff --git a/i18n/plk/package.i18n.json b/i18n/plk/package.i18n.json index 66c2549e3..000c55338 100644 --- a/i18n/plk/package.i18n.json +++ b/i18n/plk/package.i18n.json @@ -69,7 +69,7 @@ "cmake-tools.command.cmake.debugTargetAll.title": "Debuguj wszystkie projekty", "cmake-tools.command.cmake.launchTarget.title": "Uruchom bez debugowania", "cmake-tools.command.cmake.launchTargetAll.title": "Uruchom wszystkie projekty bez debugowania", - "cmake-tools.command.cmake.selectLaunchTarget.title": "Ustaw element docelowy debugowania", + "cmake-tools.command.cmake.selectLaunchTarget.title": "Ustawianie uruchamiania/debugowania elementu docelowego", "cmake-tools.command.cmake.stop.title": "Anuluj kompilację", "cmake-tools.command.cmake.stopAll.title": "Anuluj kompilację dla wszystkich projektów", "cmake-tools.command.cmake.resetState.title": "Resetuj stan rozszerzenia narzędzi CMake Tools (na potrzeby rozwiązywania problemów)", @@ -108,6 +108,7 @@ "cmake-tools.configuration.cmake.ctest.parallelJobs.markdownDescription": "Liczba równoległych zadań testowych. Użyj wartości zero, aby użyć wartości `#cmake.parallelJobs#`. Ma to zastosowanie tylko wtedy, gdy właściwość `#cmake.ctest.allowParallelJobs#` ma wartość `true`.", "cmake-tools.configuration.cmake.ctest.allowParallelJobs.description": "Umożliwia równoległe uruchamianie testów ctest, jednak dane wyjściowe wyniku może być w efekcie uszkodzony, a Eksplorator testów może nie odzwierciedlać dokładnie postępu testu.", "cmake-tools.configuration.cmake.ctest.testExplorerIntegrationEnabled.description": "Określa, czy integracja z eksploratorem testów jest włączona. Jest to przydatne do wyłączenia, jeśli wolisz używać innego rozszerzenia do integracji testów.", + "cmake-tools.configuration.cmake.ctest.testSuiteDelimiter.markdownDescription": "Opcjonalny ogranicznik używany do hierarchicznego oddzielania nazw zestawów testów i testów grupowych w Eksploratorze testów. Ten ciąg jest używany w wyrażeniu regularnym, więc niektóre ograniczniki mogą wymagać znaku ucieczki. Przykłady: `-` (jeden ogranicznik: `-`), `\\.|::` (dwa ograniczniki: `.`, `::`. Należy pamiętać, że znak `.` musi być poprzedzony znakiem ucieczki).", "cmake-tools.configuration.cmake.parseBuildDiagnostics.description": "Analizuj dane wyjściowe kompilatora pod kątem ostrzeżeń i błędów.", "cmake-tools.configuration.cmake.enabledOutputParsers.description": "Analizatory danych wyjściowych do użycia. Obsługiwane analizatory to `cmake`, `gcc`, `gnuld` dla danych wyjściowych konsolidatora typu GNULD, `msvc` dla programu Microsoft Visual C++, `ghs` dla kompilatora Green Hills z parametrami --no_wrap_diagnostics --brief_diagnostics oraz `diab` dla kompilatora Wind River Diab.", "cmake-tools.configuration.cmake.debugConfig.description": "Konfiguracja debugowania do użycia podczas debugowania elementu docelowego.", @@ -132,6 +133,7 @@ "cmake-tools.configuration.cmake.debugConfig.setupCommands.description.description": "Opis polecenia.", "cmake-tools.configuration.cmake.defaultVariants.overall.description": "Skonfiguruj domyślne ustawienia wariantu.", "cmake-tools.configuration.cmake.defaultVariants.buildType.description": "Typ kompilacji.", + "cmake-tools.configuration.cmake.defaultVariants.buildType.unspecified.long": "Pozwól narzędziu CMake wybrać domyślny typ kompilacji.", "cmake-tools.configuration.cmake.defaultVariants.buildType.debug.long": "Wyłącz optymalizacje — uwzględnij informacje o debugowaniu.", "cmake-tools.configuration.cmake.defaultVariants.buildType.release.long": "Optymalizuj pod kątem szybkości — wyklucz informacje o debugowaniu.", "cmake-tools.configuration.cmake.defaultVariants.buildType.minsize.long": "Optymalizuj pod kątem najmniejszego rozmiaru pliku binarnego — wyklucz informacje debugowania.", @@ -153,6 +155,7 @@ "cmake-tools.configuration.cmake.copyCompileCommands.description": "Kopiuj plik compile_commands.json do tej lokalizacji po pomyślnym skonfigurowaniu.", "cmake-tools.configuration.cmake.configureOnOpen.description": "Automatycznie konfiguruj katalogi projektu narzędzia CMake przy ich otwieraniu.", "cmake-tools.configuration.cmake.configureOnEdit.description": "Automatycznie konfiguruj katalogi projektu CMake po zapisaniu zawartości ustawienia cmake.sourceDirectory i pliku CMakeLists.txt.", + "cmake-tools.configuration.cmake.deleteBuildDirOnCleanConfigure.description": "Usuń cały katalog kompilacji po wywołaniu czystego konfigurowania.", "cmake-tools.configuration.cmake.setBuildTypeOnMultiConfig.description": "Ustawiaj zmienną CMAKE_BUILD_TYPE również w przypadku generatorów z wieloma konfiguracjami.", "cmake-tools.configuration.cmake.skipConfigureIfCachePresent.description": "Pomiń proces konfigurowania, jeśli pamięć podręczna jest obecna.", "cmake-tools.configuration.cmake.cmakeCommunicationMode": "Protokół używany do komunikacji między rozszerzeniem i narzędziem CMake.", @@ -196,8 +199,10 @@ "cmake-tools.configuration.cmake.revealLog.focus.description": "Dziennik jest wyświetlany, a kanał wyjściowy przyjmuje fokus kursora.", "cmake-tools.configuration.cmake.revealLog.always.description": "Dziennik jest wyświetlany, ale kanał wyjściowy nie przyjmuje fokusu kursora.", "cmake-tools.configuration.cmake.revealLog.never.description": "Dziennik nie pojawia się ani nie przyjmuje fokusu.", + "cmake-tools.configuration.cmake.revealLog.onError.description": "Dziennik pojawia się tylko wtedy, gdy kompilacja lub konfiguracja zakończy się niepowodzeniem.", "cmake-tools.configuration.cmake.exportCompileCommandsFile.description": "Umożliwia eksportowanie pliku compile_commands.json. Jest to używane tylko w scenariuszach Zestawy. W scenariuszach Ustawienia wstępne ustaw to przy użyciu pliku CMakePresets.json", "cmake-tools.configuration.cmake.useCMakePresets.description": "Użyj pliku CMakePresets.json, aby ustawić konfigurację, kompilowanie i test dysku CMake. Przy korzystaniu z pliku CMakePresets.json zestawy, warianty i niektóre ustawienia w pliku settings.json zostaną pominięte.", + "cmake-tools.configuration.cmake.useVsDeveloperEnvironment.description": "W przypadku korzystania z ustawień wstępnych narzędzia CMake w systemie Windows użyj środowiska programu Visual Studio jako środowiska nadrzędnego. Wybranie opcji auto spowoduje zastosowanie środowiska programu Visual Studio tylko wtedy, gdy wykryjemy obsługiwany kompilator (cl, clang, clang-cl, clang-cpp, clang++) lub gdy używany jest generator Ninja.", "cmake-tools.configuration.cmake.allowCommentsInPresetsFile.description": "Zezwalaj na używanie rozszerzeń JSON, takich jak komentarze w CMakePresets.json. Pamiętaj, że plik CMakePresets.json może być uznany za nieprawidłowy przez inne środowiska IDE lub w wierszu polecenia, jeśli używasz niestandardowego kodu JSON.", "cmake-tools.configuration.cmake.allowUnsupportedPresetsVersions.description": "Umożliwia korzystanie z plików ustawień wstępnych używających funkcji z wersji, których rozszerzenie Narzędzia CMake obecnie nie obsługuje. Nieznane właściwości i makra zostaną zignorowane.", "cmake-tools.configuration.cmake.ignoreCMakeListsMissing.description": "Jeśli ma wartość `true`, rozszerzenie nie będzie monitować użytkownika o wybranie pliku CMakeLists.txt do konfiguracji, gdy zostanie znaleziony w obszarze roboczym, ale nie w folderze głównym.", diff --git a/i18n/plk/src/cmake/cmakeExecutable.i18n.json b/i18n/plk/src/cmake/cmakeExecutable.i18n.json new file mode 100644 index 000000000..77a19b836 --- /dev/null +++ b/i18n/plk/src/cmake/cmakeExecutable.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "cmake.exe.not.found.in.cache": "Nie znaleziono pliku wykonywalnego narzędzia CMake w pamięci podręcznej. Sprawdzanie ponowne." +} \ No newline at end of file diff --git a/i18n/plk/src/cmakeProject.i18n.json b/i18n/plk/src/cmakeProject.i18n.json index f29b9feb9..b3be1051b 100644 --- a/i18n/plk/src/cmakeProject.i18n.json +++ b/i18n/plk/src/cmakeProject.i18n.json @@ -101,6 +101,7 @@ "options.configureWithDebuggerOnFail.do.not.show": "Nie pokazuj ponownie", "configure.failed.tryWithDebugger": "Konfiguracja zakończyła się niepowodzeniem. Czy chcesz spróbować skonfigurować przy użyciu debugera CMake?", "no.configureWithDebugger.button": "Anuluj", + "cmake.debug.name": "Debuger CMake", "finishing.configure": "Kończenie konfigurowania", "configure.failed": "Nie udało się skonfigurować projektu", "saving.open.files.before": "Zapisywanie otwartych plików przed konfigurowaniem/kompilowaniem", diff --git a/i18n/plk/src/ctest.i18n.json b/i18n/plk/src/ctest.i18n.json index 09a9820e8..113fb8503 100644 --- a/i18n/plk/src/ctest.i18n.json +++ b/i18n/plk/src/ctest.i18n.json @@ -9,10 +9,10 @@ "no.project.found": "Nie znaleziono projektu dla folderu {0}", "no.driver.found": "Nie znaleziono sterownika dla folderu {0}", "ctest.args.not.found": "Nie można pobrać argumentów testu", + "test.results.not.found": "Nie znaleziono wyników testu.", "test.failed.with.exit.code": "Test {0} zakończył się niepowodzeniem z kodem zakończenia {1}.", "test.failed.with.completion.status": "Test {0} nie powiódł się ze statusem ukończenia „{1}”.", "test.failed": "Test {0} nie powiódł się. Sprawdź dane wyjściowe, aby uzyskać więcej informacji.", - "test.results.not.found": "Nie znaleziono wyników testu.", "ctest.run.terminated": "Praca narzędzia CTest została przerwana", "ctest.finished.with.code": "Narzędzie CTest zakończyło pracę z kodem powrotnym {0}", "folder.not.found.in.test.explorer": "Nie znaleziono folderu w Eksploratorze testów: {0}", diff --git a/i18n/plk/src/drivers/cmakeFileApiDriver.i18n.json b/i18n/plk/src/drivers/cmakeFileApiDriver.i18n.json index 93271c840..c23f7c096 100644 --- a/i18n/plk/src/drivers/cmakeFileApiDriver.i18n.json +++ b/i18n/plk/src/drivers/cmakeFileApiDriver.i18n.json @@ -7,7 +7,6 @@ "creating.instance.of": "Tworzenie wystąpienia elementu {0}", "removing": "Usuwanie elementu {0}", "unlink.failed": "Nie można usunąć {0} pliku pamięci podręcznej", - "cmake.debug.name": "Debuger CMake", "toolchains.object.unsupported": "Ta wersja narzędzia CMake nie obsługuje rodzaju obiektu „toolchains”. Ścieżki kompilatora będą określane przez odczytanie pliku CMakeCache.txt.", "build.all.target": "Specjalny element docelowy umożliwiający kompilowanie wszystkich dostępnych elementów docelowych", "cmake.install.name": "Instaluj" diff --git a/i18n/plk/src/expand.i18n.json b/i18n/plk/src/expand.i18n.json index 27d43ac03..2f6140c3b 100644 --- a/i18n/plk/src/expand.i18n.json +++ b/i18n/plk/src/expand.i18n.json @@ -4,11 +4,16 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "circular.variable.reference": "Znaleziono odwołanie do zmiennej cyklicznej: {0}", + "circular.variable.reference.full": "Znaleziono odwołanie do zmiennej cyklicznej: {0}", "reached.max.recursion": "Osiągnięto maksymalną rekursję rozszerzenia ciągu. Możliwe odwołanie cykliczne.", - "exception.expanding.string": "Wyjątek podczas rozwijania ciągu {0}: {1}", - "invalid.variable.reference": "Nieprawidłowe odwołanie do zmiennej {0} w ciągu: {1}", + "max.recursion": "Maksymalna rekursja rozszerzenia ciągu", + "exception.expanding.string.full": "Wyjątek podczas rozwijania ciągu {0}: {1}", + "exception.expanding.string": "Ciąg rozszerzający wyjątek", + "invalid.variable.reference.full": "Nieprawidłowe odwołanie do zmiennej {0} w ciągu: {1}", + "invalid.variable.reference": "Nieprawidłowe odwołanie do zmiennej", + "circular.variable.reference": "Odwołanie do zmiennej cyklicznej", "command.not.supported": "Polecenia nie są obsługiwane w przypadku ciągu: {0}", - "exception.executing.command": "Wyjątek podczas wykonywania polecenia {0} dla ciągu: {1} {2}", + "exception.executing.command.full": "Wyjątek podczas wykonywania polecenia {0} dla ciągu: {1} {2}", + "exception.executing.command": "Wyjątek podczas wykonywania polecenia", "expand.expandstringhelper": "rozwinięto {0}" } \ No newline at end of file diff --git a/i18n/plk/src/extension.i18n.json b/i18n/plk/src/extension.i18n.json index aef6af093..15940a428 100644 --- a/i18n/plk/src/extension.i18n.json +++ b/i18n/plk/src/extension.i18n.json @@ -6,15 +6,6 @@ { "rereading.kits": "Ponowne odczytywanie zestawów", "dispose.cmake.tools": "Usuń narzędzia CMake Tools", - "configure.this.project": "Czy chcesz skonfigurować projekt {0}?", - "yes.button": "Tak", - "not.now.button": "Nie teraz", - "always.configure.on.open": "Czy zawsze konfigurować projekty przy otwieraniu?", - "never.configure.on.open": "Konfigurować projekty przy otwieraniu?", - "no.button": "Nie", - "never.button": "Nigdy", - "never.for.this.workspace.button": "Nie ten obszar roboczy", - "persist.config.on.open.setting": "Utrwal ustawienie konfiguracji przy otwieraniu", "configuring.workspace.on.open": "Konfigurowanie obszaru roboczego przy otwieraniu elementu {0}", "configure.now.button": "Skonfiguruj teraz", "configure.recommended": "Zaleca się przeprowadzenie ponownej konfiguracji po uaktualnieniu do nowej definicji zestawów.", @@ -35,6 +26,7 @@ "skip.set.workflow.preset": "Przy użyciu zestawów pomiń ustawienie wstępne przepływu pracy: {0}", "no.active.cmake.project": "Brak aktywnego projektu narzędzia CMake.", "invalid.folder": "Nieprawidłowy folder.", + "cmake.debug.name": "Debuger CMake", "select.a.cmake.project": "Wybierz projekt cmake", "compilation information.not.found": "Nie można znaleźć informacji o kompilacji dla tego pliku", "add.config.preset.in.test.mode": "Uruchamianie narzędzi CMake w trybie testowym. Element addConfigurePreset jest wyłączony.", diff --git a/i18n/plk/src/preset.i18n.json b/i18n/plk/src/preset.i18n.json index b8b6fc71f..a8f7417b0 100644 --- a/i18n/plk/src/preset.i18n.json +++ b/i18n/plk/src/preset.i18n.json @@ -18,25 +18,30 @@ "default.workflow.preset": "[Domyślne]", "default.workflow.preset.description": "Puste wstępne ustawienie przepływu pracy, które nie dodaje żadnych argumentów", "circular.inherits.in.config.preset": "Dziedziczenie cykliczne we wstępnie zdefiniowanej konfiguracji {0}", - "binaryDir.undefined": "Skonfiguruj ustawienie predefiniowane {0}: Nie określono elementu binaryDir, używając wartości domyślnej {1}", - "no.cl.arch": "Predefiniowana konfiguracja {0}: nie określono architektury dla elementu cl.exe, używając domyślnej opcji x86", + "no.cl.arch": "Skonfiguruj ustawienie wstępne {0}: nie określono żadnej architektury dla cl.exe przy użyciu domyślnego elementu „{1}”", "no.cl.toolset.arch": "Skonfiguruj wstępnie ustawione {0}: nie określono architektury zestawu narzędzi dla środowiska cl.exe przy użyciu domyślnego elementu {1}", "invalid.cl.toolset.arch": "Skonfiguruj wstępnie ustawione {0}: Określono nieoczekiwaną architekturę zestawu narzędzi {1} czy chodziło Ci o {2}?", "no.cl.toolset.version": "Predefiniowana konfiguracja {0}: nie określono wersji zestawu narzędzi dla cl.exe, domyślnie używając najnowszej", "unknown.toolset.option": "Nierozpoznana opcja zestawu narzędzi zostanie zignorowana: {0}", - "config.preset.not.found": "Nie można odnaleźć predefiniowanej konfiguracji o nazwie {0}", "specified.vs.not.found": "Skonfiguruj wstępnie ustawione {0}: nie znaleziono wystąpienia programu Visual Studio określonego przez {1}, co powoduje powrót do domyślnego zachowania wyszukiwania wystąpienia.", "specified.cl.not.found": "Konfigurowanie ustawień wstępnych {0}: nie znaleziono kompilatora {1} z zestawem narzędzi {2} i architekturą {3}. Może być konieczne uruchomienie elementu „CMake: skanuj w poszukiwaniu kompilatorów”, jeśli istnieje on na komputerze.", + "vs.not.found": "Skonfiguruj ustawienie wstępne {0}: nie znaleziono żadnej instalacji programu Visual Studio obsługującej określony zestaw narzędzi {1} i architektury {2}. Jeśli ten zestaw narzędzi istnieje na komputerze, może być konieczne uruchomienie polecenia „CMake: Scan for Compilers”.", "using.vs.instance": "Korzystanie ze środowiska deweloperskiego programu Visual Studio (wystąpienie {0}, wersja {1} zainstalowane w {2})", "ninja.not.set": "Ninja nie jest ustawiony na ŚCIEŻCE, spróbuj użyć {0}.", + "config.preset.not.found.full": "Nie można odnaleźć predefiniowanej konfiguracji o nazwie {0}", + "config.preset.not.found": "Nie można odnaleźć ustawienia wstępnego konfiguracji", "property.unsupported.v2": "Skonfiguruj ustawienie predefiniowane {0}: właściwość {1} jest nieobsługiwana w ustawieniach predefiniowanych w wersji 2", + "binaryDir.undefined": "Skonfiguruj ustawienie predefiniowane {0}: Nie określono elementu binaryDir, używając wartości domyślnej {1}", "circular.inherits.in.build.preset": "Dziedziczenie cykliczne we wstępnie zdefiniowanej kompilacji {0}", "circular.inherits.in.test.preset": "Dziedziczenie cykliczne we wstępnie zdefiniowanym teście {0}", "circular.inherits.in.package.preset": "Cykliczne dziedziczenia w ustawieniu wstępnym pakietu {0}", "circular.inherits.in.workflow.preset": "Cykliczne dziedziczenia w ustawieniu wstępnym przepływu pracy {0}", - "build.preset.not.found": "Nie można odnaleźć predefiniowanej kompilacji o nazwie {0}", - "test.preset.not.found": "Nie można odnaleźć predefiniowanego testu o nazwie {0}", - "package.preset.not.found": "Nie można odnaleźć ustawienia wstępnego pakietu o nazwie {0}", + "build.preset.not.found.full": "Nie można odnaleźć predefiniowanej kompilacji o nazwie {0}", + "build.preset.not.found": "Nie można odnaleźć ustawienia wstępnego kompilacji", + "test.preset.not.found.full": "Nie można odnaleźć predefiniowanego testu o nazwie {0}", + "test.preset.not.found": "Nie można odnaleźć ustawienia wstępnego testu", + "package.preset.not.found.full": "Nie można odnaleźć ustawienia wstępnego pakietu o nazwie {0}", + "package.preset.not.found": "Nie można odnaleźć ustawienia wstępnego pakietu", "workflow.preset.not.found": "Nie można odnaleźć ustawienia wstępnego przepływu pracy o nazwie {0}", "clean.not.needed.no.prior.config.preset": "Czyszczenie nie jest potrzebne: nie wybrano wcześniej predefiniowanej konfiguracji", "clean.needed.config.preset.changed": "Wymaga czyszczenia: zmieniono predefiniowaną konfigurację" diff --git a/i18n/plk/src/presetsController.i18n.json b/i18n/plk/src/presetsController.i18n.json index 5c29cffc0..4515f5347 100644 --- a/i18n/plk/src/presetsController.i18n.json +++ b/i18n/plk/src/presetsController.i18n.json @@ -25,6 +25,9 @@ "user.cancelled.compiler.selection": "Użytkownik anulował wybór kompilatorów.", "user.selected.compiler": "Użytkownik wybrał kompilator {0}", "select.one.or.more.config.preset.placeholder": "Wybierz co najmniej jedną predefiniowaną konfigurację", + "custom.configure.preset.toolchain.file": "Konfigurowanie ustawień wstępnych przy użyciu pliku łańcucha narzędzi", + "description.custom.configure.preset": "Ustawia generator Ninja, kompiluj i instaluj katalog", + "custom.configure.preset": "Ustawienie wstępne konfiguracji niestandardowej", "user.selected.config.preset": "Użytkownik wybrał predefiniowaną konfigurację {0}", "yes": "Tak", "no": "Nie", @@ -112,8 +115,12 @@ "reading.presets.file": "Odczytywanie predefiniowanego pliku {0}", "failed.to.parse": "Nie można przeanalizować elementu {0}: {1}", "included.presets.file.not.found": "Nie można odnaleźć dołączonego pliku ustawień wstępnych {0}", + "expanding.presets.file": "Rozwijanie pliku ustawień wstępnych {0}", + "expansion.errors": "W pliku ustawień wstępnych znaleziono błędy rozszerzenia.", + "successfully.expanded.presets.file": "Pomyślnie rozwinięto plik ustawień wstępnych {0}", "validating.presets.file": "Odczytywanie i sprawdzanie poprawności ustawień wstępnych „plik {0}”", "unsupported.presets": "Wykryto nieobsługiwane ustawienia wstępne w: {0}. Obsługa jest ograniczona do funkcji zdefiniowanych przez wersję {1}.", + "no.additional.properties": "NIE powinno mieć dodatkowych właściwości", "unsupported.presets.disable": "Nieznane właściwości i makra można zignorować przy użyciu ustawienia {0}.", "duplicate.build.preset.found": "Znaleziono duplikaty w kolekcji ustawień wstępnych kompilacji: „{0}”", "duplicate.test.preset.found": "Znaleziono duplikaty w kolekcji ustawień wstępnych testu: „{0}\"", @@ -121,9 +128,10 @@ "duplicate.workflow.preset.found": "Znaleziono duplikaty w kolekcji ustawień wstępnych przepływu pracy: „{0}”", "workflow.does.not.start.configure.step": "Ustawienie wstępne przepływu pracy „{0}” nie rozpoczyna się od kroku konfiguracji.", "workflow.has.subsequent.configure.preset": "Ustawienie wstępne przepływu pracy „{0}” ma inny wstępny zestaw konfiguracji „{1}” oprócz pierwszego kroku „{2}”: ", - "successfully.validated.presets": "Pomyślnie zweryfikowano ustawienia wstępne w {0}", + "successfully.validated.presets": "Pomyślnie zweryfikowano {0} względem schematu ustawień wstępnych", "use.kits.variants": "Użyj zestawów i wariantów", "edit.presets": "Zlokalizuj", "presets.version.error": "Predefinicje programu CMake (wersja 1) nie są obsługiwane. W jaki sposób chcesz kontynuować?", - "failed.writing.to.file": "Nie można zapisać do pliku: {0}" + "failed.writing.to.file": "Nie można zapisać do pliku: {0}", + "failed.to.watch": "Nie można utworzyć obserwatora dla {0}: {1}" } \ No newline at end of file diff --git a/i18n/plk/src/projectStatus.i18n.json b/i18n/plk/src/projectStatus.i18n.json index 108d0a10e..ea5bac322 100644 --- a/i18n/plk/src/projectStatus.i18n.json +++ b/i18n/plk/src/projectStatus.i18n.json @@ -24,8 +24,16 @@ "Launch": "Uruchom", "Folder": "Folder", "active.folder": "Aktywny folder", + "configPreset.change": "Zmień ustawienie wstępne konfiguracji", + "override.settings.applied": "Zastosowano ustawienia zastępowania", + "buildPreset.change": "Zmień ustawienie wstępne kompilacji", + "testPreset.change": "Zmień ustawienie wstępne testu", + "packagePreset.change": "Zmień ustawienie wstępne pakietu", + "workflowPreset.change": "Zmień ustawienie wstępne przepływu pracy", + "kit.change": "Zmień zestaw", "set.build.target": "Ustaw docelowy element kompilacji", "set.debug.target": "Ustaw element docelowy debugowania", "set.launch.target": "Ustaw element docelowy uruchamiania", - "select.active.folder": "Wybierz aktywny folder" + "select.active.folder": "Wybierz aktywny folder", + "set.variant": "Ustaw wariant" } \ No newline at end of file diff --git a/i18n/plk/src/variant.i18n.json b/i18n/plk/src/variant.i18n.json index a58f162f9..935d02ee8 100644 --- a/i18n/plk/src/variant.i18n.json +++ b/i18n/plk/src/variant.i18n.json @@ -9,6 +9,7 @@ "enable.optimizations.omit.debug": "Włącz optymalizacje, pomiń informacje debugowania", "optimize.for.smallest": "Optymalizuj pod kątem najmniejszego rozmiaru pliku binarnego", "optimize.and.debug": "Wykonaj optymalizacje I dołącz informacje debugowania", + "unspec.build.type": "Pozwól narzędziu CMake wybrać domyślny typ kompilacji", "constructing": "Tworzenie elementu {0}", "reloading.variants.file": "Ponowne ładowanie pliku wariantów {0}", "reloading.variants.from.settings": "Ponowne ładowanie wariantów z ustawień", diff --git a/i18n/ptb/package.i18n.json b/i18n/ptb/package.i18n.json index 9e14ffc71..48ddbdd81 100644 --- a/i18n/ptb/package.i18n.json +++ b/i18n/ptb/package.i18n.json @@ -69,7 +69,7 @@ "cmake-tools.command.cmake.debugTargetAll.title": "Depurar Todos os Projetos", "cmake-tools.command.cmake.launchTarget.title": "Executar sem Depuração", "cmake-tools.command.cmake.launchTargetAll.title": "Executar Todos os Projetos sem Depuração", - "cmake-tools.command.cmake.selectLaunchTarget.title": "Definir o Destino de Depuração", + "cmake-tools.command.cmake.selectLaunchTarget.title": "Definir Destino de Inicialização/Depuração", "cmake-tools.command.cmake.stop.title": "Cancelar Build", "cmake-tools.command.cmake.stopAll.title": "Cancelar o Build de Todos os Projetos", "cmake-tools.command.cmake.resetState.title": "Redefinir o Estado da Extensão de Ferramentas do CMake (para solução de problemas)", @@ -108,6 +108,7 @@ "cmake-tools.configuration.cmake.ctest.parallelJobs.markdownDescription": "O número de trabalhos de teste paralelos. Use zero para usar o valor de `#cmake.parallelJobs#`. Isso só se aplica quando `#cmake.ctest.allowParallelJobs#` é definido como `true`.", "cmake-tools.configuration.cmake.ctest.allowParallelJobs.description": "Permite que os ctests sejam executados em paralelo, no entanto, a saída do resultado pode ficar confusa como resultado, e o Gerenciador de Testes pode não refletir com precisão o progresso dos testes.", "cmake-tools.configuration.cmake.ctest.testExplorerIntegrationEnabled.description": "Se a integração com o gerenciador de teste está habilitada ou não. É útil desabilitar esse recurso se você preferir usar uma extensão diferente para a integração de testes.", + "cmake-tools.configuration.cmake.ctest.testSuiteDelimiter.markdownDescription": "Delimitador opcional usado para separar os nomes dos conjuntos de testes e agrupar os testes de maneira hierárquica no Gerenciador de Testes. Essa cadeia de caracteres é usada em uma expressão regular, portanto, alguns delimitadores podem precisar de escape. Exemplos: `-` ( Um delimitador: `-`), `\\.|::` (Dois delimitadores: `.` ou `::`. Observe que `.` precisa ser escape.)", "cmake-tools.configuration.cmake.parseBuildDiagnostics.description": "Analisar os avisos e erros da saída do compilador.", "cmake-tools.configuration.cmake.enabledOutputParsers.description": "Os analisadores de saída a serem usados. Há suporte para os analisadores `cmake`, `gcc` e `gnuld` para a saída de vinculador no estilo GNULD, `msvc` para o Microsoft Visual C++ e `ghs` para o compilador Green Hills com --no_wrap_diagnostics --brief_diagnostics e `diab` para o compilador Wind River Diab.", "cmake-tools.configuration.cmake.debugConfig.description": "A configuração de depuração a ser usada durante a depuração de um destino.", @@ -132,6 +133,7 @@ "cmake-tools.configuration.cmake.debugConfig.setupCommands.description.description": "A descrição do comando.", "cmake-tools.configuration.cmake.defaultVariants.overall.description": "Definir as configurações de variante padrão.", "cmake-tools.configuration.cmake.defaultVariants.buildType.description": "O tipo de build.", + "cmake-tools.configuration.cmake.defaultVariants.buildType.unspecified.long": "Permita que o CMake escolha o tipo de build padrão.", "cmake-tools.configuration.cmake.defaultVariants.buildType.debug.long": "Desabilitar as otimizações – incluir as informações de depuração.", "cmake-tools.configuration.cmake.defaultVariants.buildType.release.long": "Otimizar para velocidade – excluir as informações de depuração.", "cmake-tools.configuration.cmake.defaultVariants.buildType.minsize.long": "Otimizar para o menor tamanho binário – excluir as informações de depuração.", @@ -153,6 +155,7 @@ "cmake-tools.configuration.cmake.copyCompileCommands.description": "Copiar o compile_commands.json neste local após uma configuração bem-sucedida.", "cmake-tools.configuration.cmake.configureOnOpen.description": "Configurar os diretórios de projeto do CMake automaticamente quando eles forem abertos.", "cmake-tools.configuration.cmake.configureOnEdit.description": "Configure automaticamente diretórios de projeto do CMake quando o conteúdo de cmake.sourceDirectory ou de CMakeLists.txt forem salvos.", + "cmake-tools.configuration.cmake.deleteBuildDirOnCleanConfigure.description": "Exclua todo o diretório de compilação quando uma configuração limpa for invocada.", "cmake-tools.configuration.cmake.setBuildTypeOnMultiConfig.description": "Definir o CMAKE_BUILD_TYPE também nos geradores de multiconfiguração.", "cmake-tools.configuration.cmake.skipConfigureIfCachePresent.description": "Ignore o processo de configuração se o cache estiver presente.", "cmake-tools.configuration.cmake.cmakeCommunicationMode": "O protocolo usado para a comunicação entre a extensão e o CMake.", @@ -196,8 +199,10 @@ "cmake-tools.configuration.cmake.revealLog.focus.description": "O log é exibido e o canal de saída usa o foco do cursor.", "cmake-tools.configuration.cmake.revealLog.always.description": "O log é exibido, mas o canal de saída não leva o foco do cursor.", "cmake-tools.configuration.cmake.revealLog.never.description": "O log não aparece nem usa o foco.", + "cmake-tools.configuration.cmake.revealLog.onError.description": "O log aparece somente quando o build ou a configuração falha.", "cmake-tools.configuration.cmake.exportCompileCommandsFile.description": "Habilita a exportação de compile_commands.json. Isso só será utilizado em cenários de Kits. Em cenários de predefinições, defina isso utilizando CMakePresets.json", "cmake-tools.configuration.cmake.useCMakePresets.description": "Use o CMakePresets.json para configurar a unidade CMake de configuração, compilação e teste. Ao usar o CMakePresets.json, kits, variantes e algumas configurações do settings.json serão ignoradas.", + "cmake-tools.configuration.cmake.useVsDeveloperEnvironment.description": "Ao usar predefinições do CMake no Windows, use o ambiente Visual Studio como o ambiente pai. A seleção automática só aplicará o ambiente do Visual Studio quando detectarmos um compilador com suporte (cl, clang, clang-cl, clang-cpp, clang++) ou o gerador Ninja sendo usado.", "cmake-tools.configuration.cmake.allowCommentsInPresetsFile.description": "Permita o uso de extensões JSON, tais como comentários em CMakePresets.json. Observe que seu arquivo CMakePresets.json pode ser considerado inválido por outros IDEs ou na linha de comando se você usar JSON não padrão.", "cmake-tools.configuration.cmake.allowUnsupportedPresetsVersions.description": "Habilita o uso de arquivos de predefinições que estão usando recursos das versões às quais a extensão CMake Tools não dá suporte no momento. Propriedades e macros desconhecidas serão ignoradas.", "cmake-tools.configuration.cmake.ignoreCMakeListsMissing.description": "Se for `true`, a extensão não solicitará que o usuário selecione um arquivo CMakeLists.txt para configuração quando um for encontrado no espaço de trabalho, mas não na pasta raiz.", diff --git a/i18n/ptb/src/cmake/cmakeExecutable.i18n.json b/i18n/ptb/src/cmake/cmakeExecutable.i18n.json new file mode 100644 index 000000000..2b8048e53 --- /dev/null +++ b/i18n/ptb/src/cmake/cmakeExecutable.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "cmake.exe.not.found.in.cache": "O executável CMake não foi encontrado no cache. Verificando novamente." +} \ No newline at end of file diff --git a/i18n/ptb/src/cmakeProject.i18n.json b/i18n/ptb/src/cmakeProject.i18n.json index 69ead7935..4dba3f7cd 100644 --- a/i18n/ptb/src/cmakeProject.i18n.json +++ b/i18n/ptb/src/cmakeProject.i18n.json @@ -101,6 +101,7 @@ "options.configureWithDebuggerOnFail.do.not.show": "Não Mostrar Novamente", "configure.failed.tryWithDebugger": "Falha na configuração. Gostaria de tentar configurar com o CMake Debugger?", "no.configureWithDebugger.button": "Cancelar", + "cmake.debug.name": "Depurador do CMake", "finishing.configure": "Concluindo a configuração", "configure.failed": "Falha ao configurar o projeto", "saving.open.files.before": "Salvando arquivos abertos antes de configurar/compilar", diff --git a/i18n/ptb/src/ctest.i18n.json b/i18n/ptb/src/ctest.i18n.json index c3a94c96c..036939921 100644 --- a/i18n/ptb/src/ctest.i18n.json +++ b/i18n/ptb/src/ctest.i18n.json @@ -9,10 +9,10 @@ "no.project.found": "Nenhum projeto encontrado na pasta {0}", "no.driver.found": "Nenhum driver encontrado na pasta {0}", "ctest.args.not.found": "Não foi possível obter argumentos de teste", + "test.results.not.found": "Resultados do teste não encontrados.", "test.failed.with.exit.code": "Ocorreu um erro no {0} teste com o código de saída {1}.", "test.failed.with.completion.status": "Ocorreu um erro no {0} teste com o status de conclusão \"{1}\".", "test.failed": "Ocorreu um erro no {0} teste. Verifique a saída para obter mais informações.", - "test.results.not.found": "Resultados do teste não encontrados.", "ctest.run.terminated": "A execução do CTest foi terminada", "ctest.finished.with.code": "CTest concluído com código de retorno {0}", "folder.not.found.in.test.explorer": "A pasta não foi encontrada no Gerenciador de Testes: {0}", diff --git a/i18n/ptb/src/drivers/cmakeFileApiDriver.i18n.json b/i18n/ptb/src/drivers/cmakeFileApiDriver.i18n.json index 94a78e022..fda8f3c72 100644 --- a/i18n/ptb/src/drivers/cmakeFileApiDriver.i18n.json +++ b/i18n/ptb/src/drivers/cmakeFileApiDriver.i18n.json @@ -7,7 +7,6 @@ "creating.instance.of": "Criando instância de {0}", "removing": "Removendo {0}", "unlink.failed": "Falha ao remover arquivo de cache {0}", - "cmake.debug.name": "Depurador do CMake", "toolchains.object.unsupported": "Esta versão do CMake não dá suporte ao tipo de objeto \"toolchains\". Os caminhos do compilador serão determinados pela leitura de CMakeCache.txt.", "build.all.target": "Um destino especial para compilar todos os destinos disponíveis", "cmake.install.name": "Instalar" diff --git a/i18n/ptb/src/expand.i18n.json b/i18n/ptb/src/expand.i18n.json index db634b188..e3f4134a6 100644 --- a/i18n/ptb/src/expand.i18n.json +++ b/i18n/ptb/src/expand.i18n.json @@ -4,11 +4,16 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "circular.variable.reference": "Referência de variável circular encontrada: {0}", + "circular.variable.reference.full": "Referência de variável circular encontrada: {0}", "reached.max.recursion": "Recursão máxima de expansão da cadeia de caracteres atingida. Possível referência circular.", - "exception.expanding.string": "Exceção ao expandir a cadeia de {0}: {1}", - "invalid.variable.reference": "Referência de variável {0} inválida na cadeia de caracteres: {1}", + "max.recursion": "Recursão máxima de expansão de cadeia de caracteres", + "exception.expanding.string.full": "Exceção ao expandir a cadeia de {0}: {1}", + "exception.expanding.string": "Exceção expandindo cadeia de caracteres", + "invalid.variable.reference.full": "Referência de variável {0} inválida na cadeia de caracteres: {1}", + "invalid.variable.reference": "Referência de variável inválida", + "circular.variable.reference": "Referência de variável circular", "command.not.supported": "Os comandos não são compatíveis com a cadeia de caracteres: {0}", - "exception.executing.command": "Exceção ao executar o comando {0} para a cadeia de caracteres: {1} {2}", + "exception.executing.command.full": "Exceção ao executar o comando {0} para a cadeia de caracteres: {1} {2}", + "exception.executing.command": "Comando de execução de exceção", "expand.expandstringhelper": "{0} expandido" } \ No newline at end of file diff --git a/i18n/ptb/src/extension.i18n.json b/i18n/ptb/src/extension.i18n.json index a177a0a8d..151cd3b3c 100644 --- a/i18n/ptb/src/extension.i18n.json +++ b/i18n/ptb/src/extension.i18n.json @@ -6,15 +6,6 @@ { "rereading.kits": "Relendo os kits", "dispose.cmake.tools": "Descartar Ferramentas CMake", - "configure.this.project": "Deseja configurar o projeto {0}?", - "yes.button": "Sim", - "not.now.button": "Agora não", - "always.configure.on.open": "Sempre configurar projetos ao abrir?", - "never.configure.on.open": "Configurar projetos na abertura?", - "no.button": "Não", - "never.button": "Nunca", - "never.for.this.workspace.button": "Este workspace não", - "persist.config.on.open.setting": "Persistir na configuração existente ao abrir", "configuring.workspace.on.open": "Configurando o workspace no {0} aberto", "configure.now.button": "Configurar Agora", "configure.recommended": "É recomendável reconfigurar após atualizar para uma nova definição de kits.", @@ -35,6 +26,7 @@ "skip.set.workflow.preset": "Usando kits, ignore a configuração da predefinição de fluxo de trabalho: {0}", "no.active.cmake.project": "Nenhum projeto CMake ativo.", "invalid.folder": "Pasta inválida.", + "cmake.debug.name": "Depurador do CMake", "select.a.cmake.project": "Selecione um projeto cmake", "compilation information.not.found": "Não é possível localizar informações para este arquivo", "add.config.preset.in.test.mode": "Executando o CMakeTools no modo de teste. addConfigurePreset está desabilitado.", diff --git a/i18n/ptb/src/preset.i18n.json b/i18n/ptb/src/preset.i18n.json index 55a1e27ed..8b133c29e 100644 --- a/i18n/ptb/src/preset.i18n.json +++ b/i18n/ptb/src/preset.i18n.json @@ -18,25 +18,30 @@ "default.workflow.preset": "[Padrão]", "default.workflow.preset.description": "Uma predefinição de fluxo de trabalho vazia que não adiciona nenhum argumento", "circular.inherits.in.config.preset": "Circular herda na predefinição de configuração {0}", - "binaryDir.undefined": "Configurar predefinição {0}: Nenhum BinaryDir especificado, usando o valor padrão {1}", - "no.cl.arch": "Predefinição de configuração {0}: nenhuma arquitetura especificada para o cl.exe. Usando x86 por padrão", + "no.cl.arch": "Configurar predefinição {0}: Nenhum conjunto de ferramentas especificada para o cl.exe, usando '{1}' por padrão", "no.cl.toolset.arch": "Configurar predefinição {0}: Nenhuma arquitetura de conjunto de ferramentas especificada para cl.exe, usando {1} por padrão", "invalid.cl.toolset.arch": "Configurar predefinição {0}: Arquitetura de conjunto de ferramentas inesperada especificada {1}, você quis dizer {2}?", "no.cl.toolset.version": "Predefinição de configuração {0}: nenhuma versão do conjunto de ferramentas especificada para o cl.exe. Usando a última versão por padrão", "unknown.toolset.option": "A opção de conjunto de ferramentas não reconhecida será ignorada: {0}", - "config.preset.not.found": "Não foi possível encontrar a predefinição de configuração com o nome {0}", "specified.vs.not.found": "Configurar predefinição {0}: A instância do Visual Studio especificada por {1} não foi encontrada, retornando ao comportamento de pesquisa de instância padrão.", "specified.cl.not.found": "Configurar predefinição {0}: O compilador {1} com conjunto de ferramentas {2} e a arquitetura {3} não foi encontrado, você pode precisar executar o comando 'CMake: Scan for Compilers' se este conjunto de ferramentas existir no seu computador.", + "vs.not.found": "Configurar predefinição {0}: nenhuma instalação do Visual Studio encontrada dá suporte ao conjunto de ferramentas {1} e à arquitetura {2} especificados, talvez seja necessário executar o comando 'CMake: Verificar compiladores' se esse conjunto de ferramentas existir no computador.", "using.vs.instance": "Usando o ambiente de desenvolvedor do Visual Studio (instância {0}, versão {1}, instalada em {2})", "ninja.not.set": "Ninja não está definido no PATH. Tentando usar {0}", + "config.preset.not.found.full": "Não foi possível encontrar a predefinição de configuração com o nome {0}", + "config.preset.not.found": "Não foi possível encontrar a predefinição de configuração", "property.unsupported.v2": "Configurar a predefinição {0}: A propriedade {1} não é suportada nas predefinições v2", + "binaryDir.undefined": "Configurar predefinição {0}: Nenhum BinaryDir especificado, usando o valor padrão {1}", "circular.inherits.in.build.preset": "Circular herda na predefinição de construção {0}", "circular.inherits.in.test.preset": "Circular herda na predefinição de teste {0}", "circular.inherits.in.package.preset": "Heranças circulares na predefinição de pacote {0}", "circular.inherits.in.workflow.preset": "Heranças circulares na predefinição de fluxo de trabalho {0}", - "build.preset.not.found": "Não foi possível encontrar a predefinição de compilação com o nome {0}", - "test.preset.not.found": "Não foi possível encontrar a predefinição de teste com o nome {0}", - "package.preset.not.found": "Não foi possível encontrar a predefinição de pacote com o nome {0}", + "build.preset.not.found.full": "Não foi possível encontrar a predefinição de compilação com o nome {0}", + "build.preset.not.found": "Não foi possível localizar a predefinição de build", + "test.preset.not.found.full": "Não foi possível encontrar a predefinição de teste com o nome {0}", + "test.preset.not.found": "Não foi possível localizar a predefinição de teste", + "package.preset.not.found.full": "Não foi possível encontrar a predefinição de pacote com o nome {0}", + "package.preset.not.found": "Não foi possível localizar a predefinição de pacote", "workflow.preset.not.found": "Não foi possível encontrar a predefinição de fluxo de trabalho com o nome {0}", "clean.not.needed.no.prior.config.preset": "Limpeza desnecessária: nenhuma predefinição de configuração anterior selecionada", "clean.needed.config.preset.changed": "Limpeza necessária: predefinição de configuração alterada" diff --git a/i18n/ptb/src/presetsController.i18n.json b/i18n/ptb/src/presetsController.i18n.json index 1baf7f314..bcf989ebe 100644 --- a/i18n/ptb/src/presetsController.i18n.json +++ b/i18n/ptb/src/presetsController.i18n.json @@ -25,6 +25,9 @@ "user.cancelled.compiler.selection": "O usuário cancelou a seleção do compilador", "user.selected.compiler": "O usuário selecionou o compilador {0}", "select.one.or.more.config.preset.placeholder": "Selecione uma ou mais predefinições de configuração", + "custom.configure.preset.toolchain.file": "Configurar a predefinição usando o arquivo de cadeia de ferramentas", + "description.custom.configure.preset": "Define o gerador Ninja, compilar e instalar o diretório", + "custom.configure.preset": "Predefinição de configuração personalizada", "user.selected.config.preset": "O usuário selecionou a predefinição de configuração {0}", "yes": "Sim", "no": "Não", @@ -112,8 +115,12 @@ "reading.presets.file": "Lendo arquivo de predefinições {0}", "failed.to.parse": "Falha ao analisar {0}: {1}", "included.presets.file.not.found": "O arquivo incluído de predefinições {0} não pode ser encontrado", + "expanding.presets.file": "Expandindo arquivo de predefinições {0}", + "expansion.errors": "Erros de expansão encontrados no arquivo de predefinições.", + "successfully.expanded.presets.file": "Arquivo de predefinições expandido com sucesso {0}", "validating.presets.file": "Leitura e validação das predefinições \"arquivo {0}\"", "unsupported.presets": "Predefinições sem suporte detectadas no {0}. O suporte é limitado a recursos definidos pela versão {1}.", + "no.additional.properties": "NÃO deve ter propriedades adicionais", "unsupported.presets.disable": "Propriedades e macros desconhecidas podem ser ignoradas usando a configuração {0}.", "duplicate.build.preset.found": "Duplicatas encontradas na coleção de predefinições da compilação: \"{0}\"", "duplicate.test.preset.found": "Encontradas duplicatas na coleção de predefinições do teste: \"{0}\"", @@ -121,9 +128,10 @@ "duplicate.workflow.preset.found": "Encontradas duplicatas na coleção de predefinições do fluxo de trabalho: \"{0}\"", "workflow.does.not.start.configure.step": "A predefinição do fluxo de trabalho \"{0}\" não começa com uma etapa de configuração.", "workflow.has.subsequent.configure.preset": "A predefinição de fluxo de trabalho \"{0}\" tem outra predefinição de configuração \"{1}\" além da primeira etapa \"{2}\": ", - "successfully.validated.presets": "Predefinições validadas com êxito no {0}", + "successfully.validated.presets": "{0} Validado com sucesso em relação ao esquema de predefinições", "use.kits.variants": "Usar kits e variantes", "edit.presets": "Localizar", "presets.version.error": "Não há suporte para a versão 1 do CMakePresets. Como deseja prosseguir?", - "failed.writing.to.file": "Erro ao gravar no arquivo {0}" + "failed.writing.to.file": "Erro ao gravar no arquivo {0}", + "failed.to.watch": "Não foi possível criar o Observador para {0}: {1}" } \ No newline at end of file diff --git a/i18n/ptb/src/projectStatus.i18n.json b/i18n/ptb/src/projectStatus.i18n.json index 2976139c2..84a5995bd 100644 --- a/i18n/ptb/src/projectStatus.i18n.json +++ b/i18n/ptb/src/projectStatus.i18n.json @@ -24,8 +24,16 @@ "Launch": "Lançamento", "Folder": "Pasta", "active.folder": "Pasta Ativa", + "configPreset.change": "Alterar Predefinição de Configuração", + "override.settings.applied": "Substituir configurações aplicadas", + "buildPreset.change": "Alterar Predefinição de Build", + "testPreset.change": "Alterar Predefinição de Teste", + "packagePreset.change": "Alterar Predefinição de Pacote", + "workflowPreset.change": "Alterar Predefinição de Fluxo de Trabalho", + "kit.change": "Alterar Kit", "set.build.target": "Definir o Destino de Compilação", "set.debug.target": "Definir o Destino de Depuração", "set.launch.target": "Definir Destino de Inicialização", - "select.active.folder": "Selecionar a Pasta Ativa" + "select.active.folder": "Selecionar a Pasta Ativa", + "set.variant": "Definir variante" } \ No newline at end of file diff --git a/i18n/ptb/src/variant.i18n.json b/i18n/ptb/src/variant.i18n.json index 04c293f74..5689b32e0 100644 --- a/i18n/ptb/src/variant.i18n.json +++ b/i18n/ptb/src/variant.i18n.json @@ -9,6 +9,7 @@ "enable.optimizations.omit.debug": "Habilitar otimizações, omitir informações de depuração", "optimize.for.smallest": "Otimizar para o menor tamanho binário", "optimize.and.debug": "Executar otimizações E incluir informações de depuração", + "unspec.build.type": "Permitir que o CMake escolha o tipo de build padrão", "constructing": "Construindo {0}", "reloading.variants.file": "Recarregando o arquivo de variantes {0}", "reloading.variants.from.settings": "Recarregando as variantes de configurações", diff --git a/i18n/rus/package.i18n.json b/i18n/rus/package.i18n.json index 917d5dcce..c8e6c8e0f 100644 --- a/i18n/rus/package.i18n.json +++ b/i18n/rus/package.i18n.json @@ -69,7 +69,7 @@ "cmake-tools.command.cmake.debugTargetAll.title": "Отладка всех проектов", "cmake-tools.command.cmake.launchTarget.title": "Запуск без отладки", "cmake-tools.command.cmake.launchTargetAll.title": "Выполнение всех проектов без отладки", - "cmake-tools.command.cmake.selectLaunchTarget.title": "Задание целевого объекта отладки", + "cmake-tools.command.cmake.selectLaunchTarget.title": "Настройка запуска/отладки целевого объекта", "cmake-tools.command.cmake.stop.title": "Отменить сборку", "cmake-tools.command.cmake.stopAll.title": "Отмена сборки для всех проектов", "cmake-tools.command.cmake.resetState.title": "Сброс состояния расширения средств CMake (для устранения неполадок)", @@ -108,6 +108,7 @@ "cmake-tools.configuration.cmake.ctest.parallelJobs.markdownDescription": "Число параллельных тестовых заданий. Используйте ноль, чтобы использовать значение `#cmake.parallelJobs#`. Это применимо, только если для `#cmake.ctest.allowParallelJobs#` установлено `true`.", "cmake-tools.configuration.cmake.ctest.allowParallelJobs.description": "Позволяет запускать несколько ctest параллельно, однако выходной результат может быть искажен, а Обозреватель тестов может неточно отражать ход выполнения теста.", "cmake-tools.configuration.cmake.ctest.testExplorerIntegrationEnabled.description": "Включена ли интеграция с обозревателем тестов. Это удобно отключить, если вы предпочитаете использовать другое расширение для интеграции тестов.", + "cmake-tools.configuration.cmake.ctest.testSuiteDelimiter.markdownDescription": "Необязательный разделитель, используемый для разделения имен наборов тестов и иерархического группирования тестов в Обозревателе тестов. Эта строка используется в регулярном выражении, поэтому для некоторых разделителей может потребоваться экранирование. Примеры: `-` (один разделитель: `-`), `\\.|::` (два разделителя: `.` или `::`. Обратите внимание, что `.` необходимо экранировать).", "cmake-tools.configuration.cmake.parseBuildDiagnostics.description": "Анализ вывода компилятора на наличие предупреждений и ошибок.", "cmake-tools.configuration.cmake.enabledOutputParsers.description": "Используемые средства синтаксического анализа выходных данных. Поддерживаются `cmake`, `gcc`, `gnuld` для выходных данных компоновщика в стиле GNULD, `msvc` для Microsoft Visual C++, `ghs` для компилятора Green Hills с параметрами --no_wrap_diagnostics --brief_diagnostics, а также `diab` для компилятора Wind River Diab.", "cmake-tools.configuration.cmake.debugConfig.description": "Конфигурация, используемая при отладке целевого объекта.", @@ -132,6 +133,7 @@ "cmake-tools.configuration.cmake.debugConfig.setupCommands.description.description": "Описание команды.", "cmake-tools.configuration.cmake.defaultVariants.overall.description": "Настройте параметры вариантов по умолчанию.", "cmake-tools.configuration.cmake.defaultVariants.buildType.description": "Тип сборки.", + "cmake-tools.configuration.cmake.defaultVariants.buildType.unspecified.long": "Разрешить CMake выбрать тип сборки по умолчанию.", "cmake-tools.configuration.cmake.defaultVariants.buildType.debug.long": "Отключение оптимизации — включение отладочных данных.", "cmake-tools.configuration.cmake.defaultVariants.buildType.release.long": "Оптимизация для быстродействия — исключение отладочных данных.", "cmake-tools.configuration.cmake.defaultVariants.buildType.minsize.long": "Оптимизация для наименьшего размера двоичного файла — исключение отладочных данных.", @@ -153,6 +155,7 @@ "cmake-tools.configuration.cmake.copyCompileCommands.description": "Копирование сюда файла compile_commands.json после выполнения настройки.", "cmake-tools.configuration.cmake.configureOnOpen.description": "Автоматическая настройка каталогов проекта CMake при их открытии.", "cmake-tools.configuration.cmake.configureOnEdit.description": "Автоматически настраивать каталоги проекта CMake при сохранении содержимого в каталоге cmake.sourceDirectory или в файле CMakeLists.txt.", + "cmake-tools.configuration.cmake.deleteBuildDirOnCleanConfigure.description": "Удалите весь каталог сборки при вызове чистой настройки.", "cmake-tools.configuration.cmake.setBuildTypeOnMultiConfig.description": "Задание CMAKE_BUILD_TYPE также для генераторов с несколькими конфигурациями.", "cmake-tools.configuration.cmake.skipConfigureIfCachePresent.description": "Пропустить процесс настройки при наличии кэша.", "cmake-tools.configuration.cmake.cmakeCommunicationMode": "Протокол, используемый для взаимодействия между расширением и CMake.", @@ -196,8 +199,10 @@ "cmake-tools.configuration.cmake.revealLog.focus.description": "Журнал отображается и выходной канал фокусируется курсором.", "cmake-tools.configuration.cmake.revealLog.always.description": "Журнал отображается, но выходной канал не фокусируется курсором.", "cmake-tools.configuration.cmake.revealLog.never.description": "Журнал не отображается и не фокусируется.", + "cmake-tools.configuration.cmake.revealLog.onError.description": "Журнал отображается только при сбое сборки или конфигурации.", "cmake-tools.configuration.cmake.exportCompileCommandsFile.description": "Разрешает экспортировать compile_commands.json. Это используется только в сценариях комплектов. В сценариях предварительных установок установите это с помощью CMakePresets.json.", "cmake-tools.configuration.cmake.useCMakePresets.description": "Используйте CMakePresets.json для настройки конфигурации, сборки и тестирования CMake диска. При использовании CMakePresets.json наборы, варианты и некоторые параметры в settings.json будут пропущены.", + "cmake-tools.configuration.cmake.useVsDeveloperEnvironment.description": "При использовании предустановок CMake в Windows применяйте Visual Studio в качестве родительской среды. При выборе автоматического варианта среда Visual Studio будет применяться только в случае обнаружения поддерживаемого компилятора (cl, clang, clang-cl, clang-cpp, clang++) или использования генератора Ninja.", "cmake-tools.configuration.cmake.allowCommentsInPresetsFile.description": "Разрешить использование расширений JSON, таких как комментарии, в CMakePresets.json. Обратите внимание, что файл CMakePresets.json может считаться недействительным в других IDE или в командной строке, если вы используете нестандартный JSON.", "cmake-tools.configuration.cmake.allowUnsupportedPresetsVersions.description": "Позволяет использовать предустановленные файлы, использующие функции из версий, которые сейчас не поддерживаются расширением CMake Tools. Неизвестные свойства и макросы будут игнорироваться.", "cmake-tools.configuration.cmake.ignoreCMakeListsMissing.description": "Если установлено значение `true`, расширение не будет просить пользователя выбрать файл CMakeLists.txt для конфигурации, если такой файл обнаружен в рабочей области, но не в корневой папке.", diff --git a/i18n/rus/src/cmake/cmakeExecutable.i18n.json b/i18n/rus/src/cmake/cmakeExecutable.i18n.json new file mode 100644 index 000000000..1a1184082 --- /dev/null +++ b/i18n/rus/src/cmake/cmakeExecutable.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "cmake.exe.not.found.in.cache": "Исполняемый файл CMake не найден в кэше. Выполняется повторная проверка." +} \ No newline at end of file diff --git a/i18n/rus/src/cmakeProject.i18n.json b/i18n/rus/src/cmakeProject.i18n.json index c05badf62..291b58778 100644 --- a/i18n/rus/src/cmakeProject.i18n.json +++ b/i18n/rus/src/cmakeProject.i18n.json @@ -101,6 +101,7 @@ "options.configureWithDebuggerOnFail.do.not.show": "Больше не показывать", "configure.failed.tryWithDebugger": "Сбой настройки. Попробовать выполнить настройку с помощью отладчика CMake?", "no.configureWithDebugger.button": "Отмена", + "cmake.debug.name": "Отладчик CMake", "finishing.configure": "Завершение настройки.", "configure.failed": "Не удалось настроить проект.", "saving.open.files.before": "Сохранение открытых файлов перед настройкой или сборкой.", diff --git a/i18n/rus/src/ctest.i18n.json b/i18n/rus/src/ctest.i18n.json index 292359e4e..2be2d171a 100644 --- a/i18n/rus/src/ctest.i18n.json +++ b/i18n/rus/src/ctest.i18n.json @@ -9,10 +9,10 @@ "no.project.found": "Не найден проект для папки {0}", "no.driver.found": "Не найден драйвер для папки {0}", "ctest.args.not.found": "Не удалось получить тестовые аргументы", + "test.results.not.found": "Результаты теста не найдены.", "test.failed.with.exit.code": "Сбой теста {0}. Код выхода: {1}.", "test.failed.with.completion.status": "Сбой теста {0} с состоянием завершения \"{1}\".", "test.failed": "Сбой теста {0}. Дополнительные сведения см. в выходных данных.", - "test.results.not.found": "Результаты теста не найдены.", "ctest.run.terminated": "Запуск CTest был прерван.", "ctest.finished.with.code": "CTest завершила работу с кодом возврата {0}.", "folder.not.found.in.test.explorer": "Папка не найдена в обозревателе тестов: {0}", diff --git a/i18n/rus/src/drivers/cmakeFileApiDriver.i18n.json b/i18n/rus/src/drivers/cmakeFileApiDriver.i18n.json index 6a9ac38cc..b5c00c0d9 100644 --- a/i18n/rus/src/drivers/cmakeFileApiDriver.i18n.json +++ b/i18n/rus/src/drivers/cmakeFileApiDriver.i18n.json @@ -7,7 +7,6 @@ "creating.instance.of": "Создание экземпляра {0}.", "removing": "Удаление {0}.", "unlink.failed": "Не удалось удалить файл кэша {0}", - "cmake.debug.name": "Отладчик CMake", "toolchains.object.unsupported": "Эта версия CMake не поддерживает тип объекта \"цепочки инструментов\". Пути компилятора будут определяться с помощью чтения файла CMakeCache.txt.", "build.all.target": "Специальный целевой объект для создания всех доступных целевых объектов", "cmake.install.name": "Установить" diff --git a/i18n/rus/src/expand.i18n.json b/i18n/rus/src/expand.i18n.json index 536a9fbbd..a3a7f08c6 100644 --- a/i18n/rus/src/expand.i18n.json +++ b/i18n/rus/src/expand.i18n.json @@ -4,11 +4,16 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "circular.variable.reference": "Найдена циклическая ссылка на переменную: {0}", + "circular.variable.reference.full": "Найдена циклическая ссылка на переменную: {0}", "reached.max.recursion": "Достигнуто максимальное число рекурсий расширения строки. Возможна циклическая ссылка.", - "exception.expanding.string": "Исключение при развертывании строки {0}: {1}", - "invalid.variable.reference": "Недопустимая ссылка на переменную {0} в строке: {1}", + "max.recursion": "Максимальная рекурсия развертывания строки", + "exception.expanding.string.full": "Исключение при развертывании строки {0}: {1}", + "exception.expanding.string": "Исключение при развертывании строки", + "invalid.variable.reference.full": "Недопустимая ссылка на переменную {0} в строке: {1}", + "invalid.variable.reference": "Недопустимая ссылка на переменную", + "circular.variable.reference": "Циклическая ссылка на переменную", "command.not.supported": "Команды не поддерживаются для строк: {0}", - "exception.executing.command": "Исключение при выполнении команды {0} для строки: {1} {2}", + "exception.executing.command.full": "Исключение при выполнении команды {0} для строки: {1} {2}", + "exception.executing.command": "Исключение при выполнении команды", "expand.expandstringhelper": "развернуто {0}" } \ No newline at end of file diff --git a/i18n/rus/src/extension.i18n.json b/i18n/rus/src/extension.i18n.json index 029fcb765..ff4d8140a 100644 --- a/i18n/rus/src/extension.i18n.json +++ b/i18n/rus/src/extension.i18n.json @@ -6,15 +6,6 @@ { "rereading.kits": "Повторное чтение наборов.", "dispose.cmake.tools": "Удаление Средств CMake", - "configure.this.project": "Вы хотите настроить проект {0}?", - "yes.button": "Да", - "not.now.button": "Не сейчас", - "always.configure.on.open": "Всегда настраивать проекты при открытии?", - "never.configure.on.open": "Настроить проекты при открытии?", - "no.button": "Нет", - "never.button": "Никогда", - "never.for.this.workspace.button": "Не в этой рабочей области", - "persist.config.on.open.setting": "Сохранить параметр конфигурации при открытии", "configuring.workspace.on.open": "Настройка рабочей области в открытом {0}.", "configure.now.button": "Настроить сейчас", "configure.recommended": "Рекомендуется повторно настроить проект после обновления на новое определение наборов.", @@ -35,6 +26,7 @@ "skip.set.workflow.preset": "Если вы используете комплекты, пропустите предустановку рабочего процесса: {0}", "no.active.cmake.project": "Активный проект CMake отсутствует.", "invalid.folder": "Недопустимая рабочая папка.", + "cmake.debug.name": "Отладчик CMake", "select.a.cmake.project": "Выберите проект CMake", "compilation information.not.found": "Не удалось найти сведения о компиляции для этого файла.", "add.config.preset.in.test.mode": "Запуск CMakeTools в тестовом режиме. addConfigurePreset отключен.", diff --git a/i18n/rus/src/preset.i18n.json b/i18n/rus/src/preset.i18n.json index 6f93f01fa..f6c7d772a 100644 --- a/i18n/rus/src/preset.i18n.json +++ b/i18n/rus/src/preset.i18n.json @@ -18,25 +18,30 @@ "default.workflow.preset": "[По умолчанию]", "default.workflow.preset.description": "Пустая предустановка рабочего процесса, которая не добавляет никаких аргументов", "circular.inherits.in.config.preset": "Циклические наследования в предустановке конфигурации {0}", - "binaryDir.undefined": "Настройка предустановки {0}: параметр binaryDir не указан, используется значение по умолчанию {1}", - "no.cl.arch": "Предустановка конфигурации {0}: Не указана архитектура для cl.exe, по умолчанию используется x86", + "no.cl.arch": "Настройка предустановки {0}: не указана архитектура для cl.exe, по умолчанию используется {1}", "no.cl.toolset.arch": "Предустановка конфигурации {0}: не указана архитектура набора инструментов для cl.exe, по умолчанию используется {1}", "invalid.cl.toolset.arch": "Настройка предустановки {0}: указана непредвиденная архитектура набора инструментов {1}. Вы имели в виду {2}?", "no.cl.toolset.version": "Предустановка конфигурации {0}: Не указана версия набора инструментов cl.exe, по умолчанию используется последняя", "unknown.toolset.option": "Нераспознанный параметр набора инструментов будет проигнорирован: {0}", - "config.preset.not.found": "Не удалось найти предустановку конфигурации с именем {0}", "specified.vs.not.found": "Настройка предустановки{0}: экземпляр Visual Studio, указанный в {1}, не найден, возвращение к поведению при поиске экземпляра по умолчанию.", "specified.cl.not.found": "Настройка предустановки {0}: компилятор {1} с набором инструментов {2} и архитектурой {3} не найден. Может потребоваться запустить команду \"CMake: поиск компиляторов\", если этот набор инструментов существует на вашем компьютере.", + "vs.not.found": "Настройка предустановки {0}: не найдена установка Visual Studio, поддерживающая указанный набор инструментов {1} и архитектуру {2}. Возможно, потребуется выполнить команду \"CMake: сканирование на наличие компиляторов\", если набор инструментов существует на компьютере.", "using.vs.instance": "Использование среды разработчика из Visual Studio (экземпляр {0}, версия {1}, установленная в {2})", "ninja.not.set": "Ninja не задан в переменной PATH, выполняется попытка использовать {0}", + "config.preset.not.found.full": "Не удалось найти предустановку конфигурации с именем {0}", + "config.preset.not.found": "Не удалось найти предустановку конфигурации", "property.unsupported.v2": "Настройка предустановки {0}: свойство {1} не поддерживается для предустановок версии 2", + "binaryDir.undefined": "Настройка предустановки {0}: параметр binaryDir не указан, используется значение по умолчанию {1}", "circular.inherits.in.build.preset": "Циклические наследования в предустановке сборки {0}", "circular.inherits.in.test.preset": "Циклические наследования в предустановке теста {0}", "circular.inherits.in.package.preset": "Циклические наследования в предустановке пакета {0}", "circular.inherits.in.workflow.preset": "Циклические наследования в предустановке рабочего процесса {0}", - "build.preset.not.found": "Не удалось найти предустановку сборки с именем {0}", - "test.preset.not.found": "Не удалось найти предустановку теста с именем {0}", - "package.preset.not.found": "Не удалось найти предустановку пакета с именем {0}", + "build.preset.not.found.full": "Не удалось найти предустановку сборки с именем {0}", + "build.preset.not.found": "Не удалось найти предустановку сборки", + "test.preset.not.found.full": "Не удалось найти предустановку теста с именем {0}", + "test.preset.not.found": "Не удалось найти предустановку теста", + "package.preset.not.found.full": "Не удалось найти предустановку пакета с именем {0}", + "package.preset.not.found": "Не удалось найти предустановку пакета", "workflow.preset.not.found": "Не удалось найти предустановку рабочего процесса с именем {0}", "clean.not.needed.no.prior.config.preset": "Очистка не требуется: предыдущая предустановка конфигурации не выбрана.", "clean.needed.config.preset.changed": "Требуется очистка: предустановка конфигурации изменена" diff --git a/i18n/rus/src/presetsController.i18n.json b/i18n/rus/src/presetsController.i18n.json index 408ba6adc..94520dd06 100644 --- a/i18n/rus/src/presetsController.i18n.json +++ b/i18n/rus/src/presetsController.i18n.json @@ -25,6 +25,9 @@ "user.cancelled.compiler.selection": "Пользователь отменил выбор компилятора", "user.selected.compiler": "Пользователь выбрал компилятор {0}", "select.one.or.more.config.preset.placeholder": "Выберите одну или несколько предустановок конфигурации", + "custom.configure.preset.toolchain.file": "Настройка предустановки с помощью файла цепочки инструментов", + "description.custom.configure.preset": "Настраивает генератор Ninja, сборку и каталог установки", + "custom.configure.preset": "Пользовательская предустановка конфигурации", "user.selected.config.preset": "Пользователь выбрал предустановку конфигурации {0}", "yes": "Да", "no": "Нет", @@ -112,8 +115,12 @@ "reading.presets.file": "Чтение файла предустановок {0}", "failed.to.parse": "Не удалось проанализировать {0}: {1}", "included.presets.file.not.found": "Не удается найти включенный файл предустановок {0}", + "expanding.presets.file": "Развертывание файла предустановок {0}", + "expansion.errors": "В файле предустановок обнаружены ошибки развертывания.", + "successfully.expanded.presets.file": "Файл предустановок {0} развернут", "validating.presets.file": "Чтение и проверка предустановок \"файла {0}\"", "unsupported.presets": "В {0} обнаружены неподдерживаемые предустановки. Поддержка ограничена функциями, определенными версией {1}.", + "no.additional.properties": "НЕ должно быть дополнительных свойств", "unsupported.presets.disable": "Неизвестные свойства и макрос можно игнорировать с помощью параметра {0}.", "duplicate.build.preset.found": "Обнаружены дубликаты в коллекции предустановок сборки: \"{0}\"", "duplicate.test.preset.found": "Обнаружены дубликаты в коллекции предустановок теста: \"{0}\"", @@ -121,9 +128,10 @@ "duplicate.workflow.preset.found": "Обнаружены дубликаты в коллекции предустановок рабочего процесса: \"{0}\"", "workflow.does.not.start.configure.step": "Предустановка рабочего процесса \"{0}\" не начинается с шага настройки.", "workflow.has.subsequent.configure.preset": "Предустановка рабочего процесса \"{0}\" содержит другую предустановку настройки \"{1}\" помимо первого шага \"{2}\": ", - "successfully.validated.presets": "Выполнена проверка предустановок в {0}", + "successfully.validated.presets": "Успешно выполнена проверка {0} в схеме предустановок", "use.kits.variants": "Использовать наборы и варианты", "edit.presets": "Найти", "presets.version.error": "CMakePresets версии 1 не поддерживается. Выберите нужное действие.", - "failed.writing.to.file": "Ошибка при записи в файл {0}" + "failed.writing.to.file": "Ошибка при записи в файл {0}", + "failed.to.watch": "Не удалось создать Наблюдателя для {0}: {1}" } \ No newline at end of file diff --git a/i18n/rus/src/projectStatus.i18n.json b/i18n/rus/src/projectStatus.i18n.json index bc9a37f61..37c19f71a 100644 --- a/i18n/rus/src/projectStatus.i18n.json +++ b/i18n/rus/src/projectStatus.i18n.json @@ -24,8 +24,16 @@ "Launch": "Запуск", "Folder": "Папка", "active.folder": "Активная папка", + "configPreset.change": "Изменить предустановку конфигурации", + "override.settings.applied": "Параметры переопределения применены", + "buildPreset.change": "Изменить предустановку сборки", + "testPreset.change": "Изменить предустановку теста", + "packagePreset.change": "Изменить предустановку пакета", + "workflowPreset.change": "Изменить предустановку рабочего процесса", + "kit.change": "Изменить набор", "set.build.target": "Задание целевого объекта сборки", "set.debug.target": "Задать целевой объект отладки", "set.launch.target": "Установить целевой объект", - "select.active.folder": "Выбор активной папки" + "select.active.folder": "Выбор активной папки", + "set.variant": "Настроить вариант" } \ No newline at end of file diff --git a/i18n/rus/src/variant.i18n.json b/i18n/rus/src/variant.i18n.json index b63a1e6aa..0bd4081fa 100644 --- a/i18n/rus/src/variant.i18n.json +++ b/i18n/rus/src/variant.i18n.json @@ -9,6 +9,7 @@ "enable.optimizations.omit.debug": "Включить оптимизацию, опустить отладочную информацию", "optimize.for.smallest": "Оптимизировать для минимального размера двоичных файлов", "optimize.and.debug": "Выполнить оптимизацию и включить отладочную информацию", + "unspec.build.type": "Разрешить CMake выбрать тип сборки по умолчанию", "constructing": "Конструирование {0}.", "reloading.variants.file": "Повторная загрузка файла вариантов {0}.", "reloading.variants.from.settings": "Повторная загрузка вариантов из параметров.", diff --git a/i18n/trk/package.i18n.json b/i18n/trk/package.i18n.json index d9e43dacd..cb91e74f6 100644 --- a/i18n/trk/package.i18n.json +++ b/i18n/trk/package.i18n.json @@ -69,7 +69,7 @@ "cmake-tools.command.cmake.debugTargetAll.title": "Tüm Projelerde Hata Ayıkla", "cmake-tools.command.cmake.launchTarget.title": "Hata Ayıklama Olmadan Çalıştır", "cmake-tools.command.cmake.launchTargetAll.title": "Tüm Projeleri Hata Ayıklama Olmadan Çalıştır", - "cmake-tools.command.cmake.selectLaunchTarget.title": "Hata Ayıklama Hedefini Ayarla", + "cmake-tools.command.cmake.selectLaunchTarget.title": "Başlatma/Hata Ayıklama Hedefini Ayarla", "cmake-tools.command.cmake.stop.title": "Derlemeyi İptal Et", "cmake-tools.command.cmake.stopAll.title": "Tüm Projeler için Derlemeyi İptal Et", "cmake-tools.command.cmake.resetState.title": "CMake Araçları Uzantısı Durumunu Sıfırla (Sorun giderme için)", @@ -108,6 +108,7 @@ "cmake-tools.configuration.cmake.ctest.parallelJobs.markdownDescription": "Paralel test işlerinin sayısı. `#cmake.parallelJobs#` değerini kullanmak için sıfır kullanın. Bu yalnızca `#cmake.ctest.allowParallelJobs#` değeri `true` olarak ayarlandığında geçerlidir.", "cmake-tools.configuration.cmake.ctest.allowParallelJobs.description": "Testlerin paralel olarak çalıştırılmasına izin verir, ancak bunun sonucunda sonuç çıktısı bozulabilir ve Test Gezgini test ilerlemesini doğru şekilde yansıtmayabilir.", "cmake-tools.configuration.cmake.ctest.testExplorerIntegrationEnabled.description": "Test gezginiyle tümleştirmenin etkinleştirilip etkinleştirilmediği. Test tümleştirmesi için farklı bir uzantı kullanmayı tercih ediyorsanız devre dışı bırakmak faydalıdır.", + "cmake-tools.configuration.cmake.ctest.testSuiteDelimiter.markdownDescription": "Test Listesi Düzenleyicisi’nde test paketi adlarını ve grup testlerini hiyerarşik olarak ayırmak için kullanılan isteğe bağlı sınırlayıcı. Bu dize bir Normal İfadede kullanıldığından bazı sınırlayıcılar kaçış karakteri gerektirebilir. Örnekler: `-` (Bir sınırlayıcı: `-`), `\\.|::` (İki sınırlayıcı: `.` veya `::`. `.` için kaçış karakteri eklenmesi gerektiğini unutmayın.)", "cmake-tools.configuration.cmake.parseBuildDiagnostics.description": "Uyarılar ve hatalar için derleyici çıkışını ayrıştır.", "cmake-tools.configuration.cmake.enabledOutputParsers.description": "Kullanılacak çıkış ayrıştırıcıları. Desteklenen ayrıştırıcılar: GNULD stili bağlayıcı çıkışı için `cmake`, `gcc` ve `gnuld`, Microsoft Visual C++ için `msvc`, --no_wrap_diagnostics --brief_diagnostics içeren Green Hills derleyicisi için `ghs` ve Wind River Diab derleyicisi için `diab`.", "cmake-tools.configuration.cmake.debugConfig.description": "Bir hedefte hata ayıklanırken kullanılacak hata ayıklama yapılandırması.", @@ -132,6 +133,7 @@ "cmake-tools.configuration.cmake.debugConfig.setupCommands.description.description": "Komutun açıklaması.", "cmake-tools.configuration.cmake.defaultVariants.overall.description": "Varsayılan varyant ayarlarını yapılandırın.", "cmake-tools.configuration.cmake.defaultVariants.buildType.description": "Derleme türü.", + "cmake-tools.configuration.cmake.defaultVariants.buildType.unspecified.long": "CMake'in varsayılan derleme türünü seçmesini izin ver.", "cmake-tools.configuration.cmake.defaultVariants.buildType.debug.long": "İyileştirmeleri devre dışı bırak. Hata ayıklama bilgilerini dahil et.", "cmake-tools.configuration.cmake.defaultVariants.buildType.release.long": "Hız için iyileştirin. Hata ayıklama bilgilerini hariç tutun.", "cmake-tools.configuration.cmake.defaultVariants.buildType.minsize.long": "En küçük ikili boyutu için iyileştirin. Hata ayıklama bilgilerini hariç tutun.", @@ -153,6 +155,7 @@ "cmake-tools.configuration.cmake.copyCompileCommands.description": "Başarılı bir yapılandırmadan sonra compile_commands.json dosyasını bu konuma kopyala.", "cmake-tools.configuration.cmake.configureOnOpen.description": "CMake proje dizinleri açıldığında bu dizinleri otomatik olarak yapılandır.", "cmake-tools.configuration.cmake.configureOnEdit.description": "cmake.sourceDirectory veya CMakeLists.txt içeriği kaydedildiğinde CMake proje dizinlerini otomatik olarak yapılandırın.", + "cmake-tools.configuration.cmake.deleteBuildDirOnCleanConfigure.description": "Temiz bir yapılandırma çağrıldığında tüm derleme dizinini silin.", "cmake-tools.configuration.cmake.setBuildTypeOnMultiConfig.description": "CMAKE_BUILD_TYPE ayarlamasını çok yapılandırmalı oluşturucular üzerinde de yapın.", "cmake-tools.configuration.cmake.skipConfigureIfCachePresent.description": "Önbellek mevcutsa yapılandırma işlemini atlayın.", "cmake-tools.configuration.cmake.cmakeCommunicationMode": "Uzantı ve CMake arasında iletişim kurmak için kullanılan protokol.", @@ -196,8 +199,10 @@ "cmake-tools.configuration.cmake.revealLog.focus.description": "Günlük görünür ve çıkış kanalı imlecin odağında olur.", "cmake-tools.configuration.cmake.revealLog.always.description": "Günlük görünür ancak çıkış kanalı imlecin odağında olmaz.", "cmake-tools.configuration.cmake.revealLog.never.description": "Günlük görünmez ve odakta olmaz.", + "cmake-tools.configuration.cmake.revealLog.onError.description": "Günlük yalnızca derleme veya yapılandırma başarısız olduğunda görünür.", "cmake-tools.configuration.cmake.exportCompileCommandsFile.description": "compile_commands.js dosyasının dışarı aktarılmasını sağlar. Bu yalnızca Kits senaryolarında kullanılır. Önayar senaryolarında bunu lütfen CMakePresets.json kullanarak ayarlayın.", "cmake-tools.configuration.cmake.useCMakePresets.description": "CMake yapılandırma, derleme ve test sürücüsünü yapılandırmak için CMakePresets.json kullanın. CMakePresets.json kullanılırken kitler, çeşitler ve settings.json'daki bazı ayarla yoksayılır.", + "cmake-tools.configuration.cmake.useVsDeveloperEnvironment.description": "Windows'da CMake Önayarlarını kullanırken, Visual Studio ortamını üst ortam olarak kullanın. Otomatik seçeneği belirlendiğinde, Visual Studio ortamı yalnızca desteklenen bir derleyici (cl, clang, clang-cl, clang-cpp, clang++) algılandığında veya Ninja oluşturucusu kullanıldığında uygulanır.", "cmake-tools.configuration.cmake.allowCommentsInPresetsFile.description": "CMakePresets.json'daki yorumlar gibi JSON uzantılarının kullanımına izin verin. Standart olmayan JSON kullanıyorsanız, CMakePresets.json dosyanızın diğer IDE'ler tarafından veya komut satırında geçersiz sayılabileceğini lütfen unutmayın.", "cmake-tools.configuration.cmake.allowUnsupportedPresetsVersions.description": "CMake Araçları uzantısının şu anda desteklemediği sürümlerdeki özellikleri kullanan ön ayar dosyalarının kullanımını etkinleştirir. Bilinmeyen özellikler ve makrolar yoksayılır.", "cmake-tools.configuration.cmake.ignoreCMakeListsMissing.description": "`true` ise; CMakeLists.txt, çalışma alanında bulunduğunda ama kök klasörde bulunmadığında, uzantı kullanıcıdan yapılandırma için bir CMakeLists.txt dosyası seçmesini istemez.", diff --git a/i18n/trk/src/cmake/cmakeExecutable.i18n.json b/i18n/trk/src/cmake/cmakeExecutable.i18n.json new file mode 100644 index 000000000..5a393f69d --- /dev/null +++ b/i18n/trk/src/cmake/cmakeExecutable.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "cmake.exe.not.found.in.cache": "CMake yürütülebilir dosyası önbellekte bulunamadı. Yeniden denetleniyor." +} \ No newline at end of file diff --git a/i18n/trk/src/cmakeProject.i18n.json b/i18n/trk/src/cmakeProject.i18n.json index 3876be137..c7f7b7ed1 100644 --- a/i18n/trk/src/cmakeProject.i18n.json +++ b/i18n/trk/src/cmakeProject.i18n.json @@ -101,6 +101,7 @@ "options.configureWithDebuggerOnFail.do.not.show": "Bir Daha Gösterme", "configure.failed.tryWithDebugger": "Yapılandırma başarısız oldu. CMake Hata Ayıklayıcısı ile yapılandırmayı denemek ister misiniz?", "no.configureWithDebugger.button": "İptal", + "cmake.debug.name": "CMake Hata Ayıklayıcısı", "finishing.configure": "Yapılandırma tamamlanıyor", "configure.failed": "Proje yapılandırılamadı", "saving.open.files.before": "Yapılandırma/derleme öncesinde açık dosyalar kaydediliyor", diff --git a/i18n/trk/src/ctest.i18n.json b/i18n/trk/src/ctest.i18n.json index 690d949e2..6b651817c 100644 --- a/i18n/trk/src/ctest.i18n.json +++ b/i18n/trk/src/ctest.i18n.json @@ -9,10 +9,10 @@ "no.project.found": "{0} klasörü için proje bulunamadı", "no.driver.found": "{0} klasörü için sürücü bulunamadı", "ctest.args.not.found": "Test bağımsız değişkenleri alınamadı", + "test.results.not.found": "Test sonuçları bulunamadı.", "test.failed.with.exit.code": "{0} testi {1} çıkış kodu ile başarısız oldu.", "test.failed.with.completion.status": "{0} testi, \"{1}\" tamamlanma durumuyla başarısız oldu.", "test.failed": "{0} testi başarısız oldu. Daha fazla bilgi için lütfen çıkışa bakın.", - "test.results.not.found": "Test sonuçları bulunamadı.", "ctest.run.terminated": "CTest çalıştırması sonlandırıldı", "ctest.finished.with.code": "CTest, {0} dönüş koduyla tamamlandı", "folder.not.found.in.test.explorer": "Klasör Test Gezgini'nde bulunamadı: {0}", diff --git a/i18n/trk/src/drivers/cmakeFileApiDriver.i18n.json b/i18n/trk/src/drivers/cmakeFileApiDriver.i18n.json index eb92ec7b4..75ea66b50 100644 --- a/i18n/trk/src/drivers/cmakeFileApiDriver.i18n.json +++ b/i18n/trk/src/drivers/cmakeFileApiDriver.i18n.json @@ -7,7 +7,6 @@ "creating.instance.of": "{0} örneği oluşturuluyor", "removing": "{0} kaldırılıyor", "unlink.failed": "Önbellek dosyası {0} kaldırılamadı", - "cmake.debug.name": "CMake Hata Ayıklayıcısı", "toolchains.object.unsupported": "CMake'in bu sürümü \"toolchains\" nesne türünü desteklemiyor. Derleyici yolları CMakeCache.txt okunarak belirlenecek.", "build.all.target": "Tüm kullanılabilir hedefleri derlemek için özel bir hedef", "cmake.install.name": "Yükle" diff --git a/i18n/trk/src/expand.i18n.json b/i18n/trk/src/expand.i18n.json index 25abe8b27..a3ff03c93 100644 --- a/i18n/trk/src/expand.i18n.json +++ b/i18n/trk/src/expand.i18n.json @@ -4,11 +4,16 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "circular.variable.reference": "Döngüsel değişken başvurusu bulundu: {0}", + "circular.variable.reference.full": "Döngüsel değişken başvurusu bulundu: {0}", "reached.max.recursion": "En yüksek dize genişletme özyinelemesine ulaşıldı. Olası döngüsel başvuru.", - "exception.expanding.string": "{0}: {1} dizesi genişletilirken özel durum", - "invalid.variable.reference": "{1} dizesinde geçersiz {0} değişken başvurusu", + "max.recursion": "Maksimum dize genişletme özyineleme", + "exception.expanding.string.full": "{0}: {1} dizesi genişletilirken özel durum", + "exception.expanding.string": "Dize genişletilirken özel durum oluştu", + "invalid.variable.reference.full": "{1} dizesinde geçersiz {0} değişken başvurusu", + "invalid.variable.reference": "Geçersiz değişken başvurusu", + "circular.variable.reference": "Döngüsel değişken başvurusu", "command.not.supported": "Şu dize için komutlar desteklenmiyor: {0}", - "exception.executing.command": "Dizesi için {0} komutu yürütülürken özel durum oluştu: {1} {2}", + "exception.executing.command.full": "Dizesi için {0} komutu yürütülürken özel durum oluştu: {1} {2}", + "exception.executing.command": "Komut yürütülürken özel durum oluştu", "expand.expandstringhelper": "genişletilmiş {0}" } \ No newline at end of file diff --git a/i18n/trk/src/extension.i18n.json b/i18n/trk/src/extension.i18n.json index 29d320e09..19b05b5a9 100644 --- a/i18n/trk/src/extension.i18n.json +++ b/i18n/trk/src/extension.i18n.json @@ -6,15 +6,6 @@ { "rereading.kits": "Setler yeniden okunuyor", "dispose.cmake.tools": "CMake Araçları'nı at", - "configure.this.project": "{0} projesini yapılandırmak istiyor musunuz?", - "yes.button": "Evet", - "not.now.button": "Şimdi değil", - "always.configure.on.open": "Projeler her zaman açıldıktan sonra mı yapılandırılsın?", - "never.configure.on.open": "Projeler açıldıktan sonra yapılandırılsın mı?", - "no.button": "Hayır", - "never.button": "Hiçbir Zaman", - "never.for.this.workspace.button": "Bu çalışma alanı değil", - "persist.config.on.open.setting": "Açılışta yapılandır ayarını kalıcı yap", "configuring.workspace.on.open": "Açık {0} konumunda çalışma alanı yapılandırılıyor", "configure.now.button": "Şimdi Yapılandır", "configure.recommended": "Yeni bir set tanımına yükselttikten sonra yeniden yapılandırmanız önerilir.", @@ -35,6 +26,7 @@ "skip.set.workflow.preset": "Setleri kullanarak iş akışı ön ayarını belirlemeyi atla: {0}", "no.active.cmake.project": "Etkin CMake projesi yok.", "invalid.folder": "Geçersiz klasör.", + "cmake.debug.name": "CMake Hata Ayıklayıcısı", "select.a.cmake.project": "CMake projesi seç", "compilation information.not.found": "Bu dosya için derleme bilgileri bulunamıyor", "add.config.preset.in.test.mode": "CMakeTools test modunda çalıştırılıyor. addConfigurePreset devre dışı bırakıldı.", diff --git a/i18n/trk/src/preset.i18n.json b/i18n/trk/src/preset.i18n.json index 4fe9b02c5..d5674868d 100644 --- a/i18n/trk/src/preset.i18n.json +++ b/i18n/trk/src/preset.i18n.json @@ -18,25 +18,30 @@ "default.workflow.preset": "[Varsayılan]", "default.workflow.preset.description": "Bağımsız değişken eklemeyen boş iş akışı ön ayarı", "circular.inherits.in.config.preset": "{0} yapılandırma ön ayarındaki döngüsel devralmalar", - "binaryDir.undefined": "{0} ön ayarını yapılandır: Varsayılan {1} değeri kullanılarak binaryDir belirtilmedi", - "no.cl.arch": "Yapılandırma ön ayarı {0}: cl.exe için varsayılan olarak x86 kullanan herhangi bir mimari belirtilmedi", + "no.cl.arch": "Yapılandırma ön ayarı {0}: cl.exe için varsayılan olarak {1} kullanan herhangi bir mimari belirtilmedi", "no.cl.toolset.arch": "Yapılandırma ön ayarı {0}: cl.exe için varsayılan olarak {1} kullanan herhangi bir araç takımı mimarisi belirtilmedi", "invalid.cl.toolset.arch": "Yapılandırma ön ayarı {0}: Beklenmeyen araç takımı mimarisi {1} olarak belirtildi, şunu mu demek istediniz: {2}?", "no.cl.toolset.version": "Yapılandırma ön ayarı {0}: cl.exe için varsayılan olarak en son kullanılan araç takımı sürümü belirtilmemiş", "unknown.toolset.option": "Tanınmayan araç takımı seçeneği yoksayılır: {0}", - "config.preset.not.found": "Adı {0} olan yapılandırma ön ayarı bulunamadı", "specified.vs.not.found": "Yapılandırma ön ayarı {0}: {1} tarafından belirtilen Visual Studio örneği bulunamadı, varsayılan örnek arama davranışına geri çekiliyor.", "specified.cl.not.found": "{0} yapılandırma ön ayarı: {2} araç takımı ve {3} mimarisiyle belirtilen {1} derleyicisi bulunamadı. Bilgisayarınızda bu araç seti varsa, “CMake: Derleyiciler için Tara” komutunu çalıştırmanız gerekebilir.", + "vs.not.found": "Yapılandırma ön ayarı {0}: Belirtilen {1} araç takımını ve {2} mimarisini destekleyen bir Visual Studio yüklemesi bulunamadı. Bu araç takımı bilgisayarınızda varsa 'CMake: Derleyicileri Tara' komutunu çalıştırmanız gerekebilir.", "using.vs.instance": "Visual Studio geliştirici ortamını kullanma (örnek {0}, sürüm {1}, yükleme: {2})", "ninja.not.set": "Ninja YOL’a ayarlanmadı, {0} kullanmaya çalışıyor", + "config.preset.not.found.full": "Adı {0} olan yapılandırma ön ayarı bulunamadı", + "config.preset.not.found": "Yapılandırma ön ayarı bulunamadı", "property.unsupported.v2": "{0} ön ayarını yapılandır: {1} özelliği, v2 ön ayarlarında desteklenmiyor", + "binaryDir.undefined": "{0} ön ayarını yapılandır: Varsayılan {1} değeri kullanılarak binaryDir belirtilmedi", "circular.inherits.in.build.preset": "{0} derleme ön ayarındaki döngüsel devralmalar", "circular.inherits.in.test.preset": "{0} test ön ayarındaki döngüsel devralmalar", "circular.inherits.in.package.preset": "Paket ön ayarında döngüsel devralmalar {0}", "circular.inherits.in.workflow.preset": "İş akışı ön ayarında döngüsel devralmalar {0}", - "build.preset.not.found": "{0} adlı derleme ön ayarı bulunamadı", - "test.preset.not.found": "{0} adlı test ön ayarı bulunamadı", - "package.preset.not.found": "{0} adlı paket ön ayarı bulunamadı", + "build.preset.not.found.full": "{0} adlı derleme ön ayarı bulunamadı", + "build.preset.not.found": "Derleme ön ayarı bulunamadı", + "test.preset.not.found.full": "{0} adlı test ön ayarı bulunamadı", + "test.preset.not.found": "Test ön ayarı bulunamadı", + "package.preset.not.found.full": "{0} adlı paket ön ayarı bulunamadı", + "package.preset.not.found": "Paket ön ayarı bulunamadı", "workflow.preset.not.found": "{0} adlı iş akışı ön ayarı bulunamadı", "clean.not.needed.no.prior.config.preset": "Temizleme gerekmez: Önceden yapılandırma ön ayarı seçilmedi", "clean.needed.config.preset.changed": "Temizleme gerekir: yapılandırma ön ayarı değişti" diff --git a/i18n/trk/src/presetsController.i18n.json b/i18n/trk/src/presetsController.i18n.json index fc2fa374a..1d63f9873 100644 --- a/i18n/trk/src/presetsController.i18n.json +++ b/i18n/trk/src/presetsController.i18n.json @@ -25,6 +25,9 @@ "user.cancelled.compiler.selection": "Kullanıcı derleyici seçimini iptal etti", "user.selected.compiler": "Kullanıcı derleyiciyi {0} seçti", "select.one.or.more.config.preset.placeholder": "Bir veya daha fazla hazır yapılandırma ön ayarı seçin", + "custom.configure.preset.toolchain.file": "Araç zinciri dosyasını kullanarak ön ayarı yapılandır", + "description.custom.configure.preset": "Ninja oluşturucusu, derleme ve yükleme dizinini ayarlar", + "custom.configure.preset": "Özel yapılandırma ön ayarı", "user.selected.config.preset": "Kullanıcı yapılandırma ön ayarını {0} seçti", "yes": "Evet", "no": "Hayır", @@ -112,8 +115,12 @@ "reading.presets.file": "Ön ayar dosyaları {0} okunuyor", "failed.to.parse": "{0} ayrıştırılamadı: {1}", "included.presets.file.not.found": "Eklenen ön ayarlar dosyası ({0}) bulunamıyor", + "expanding.presets.file": "{0} ön ayarlar dosyası genişletiliyor", + "expansion.errors": "Ön ayarlar dosyasında genişletme hataları bulundu.", + "successfully.expanded.presets.file": "{0} ön ayarlar dosyası başarıyla genişletildi", "validating.presets.file": "\"File {0}\" ön ayarları okunuyor ve doğrulanıyor", "unsupported.presets": "{0} içinde desteklenmeyen ön ayarlar algılandı. Destek, {1} sürümü tarafından tanımlanan özelliklerle sınırlıdır.", + "no.additional.properties": "ek özelliklere sahip OLMAMALI", "unsupported.presets.disable": "Bilinmeyen özellikler ve makrolar {0} ayarı kullanılarak yoksayılabilir.", "duplicate.build.preset.found": "Derleme ön ayarları koleksiyonunda kopyalar bulundu: \"{0}\"", "duplicate.test.preset.found": "Test ön ayarları koleksiyonunda kopyalar bulundu: \"{0}\"", @@ -121,9 +128,10 @@ "duplicate.workflow.preset.found": "İş akışı ön ayarları koleksiyonunda kopyalar bulundu: \"{0}\"", "workflow.does.not.start.configure.step": "İş akışı ön ayarı \"{0}\" bir yapılandırma adımıyla başlamıyor.", "workflow.has.subsequent.configure.preset": "İş akışı ön ayarı \"{0}\", \"{2}\" ilk adımının yanı sıra başka bir yapılandırma ön ayarı \"{1}\" içeriyor: ", - "successfully.validated.presets": "{0} içinde ön ayarlar başarıyla doğrulandı", + "successfully.validated.presets": "{0} ön ayarlar şemasına göre başarıyla doğrulandı", "use.kits.variants": "Setleri ve çeşitleri kullanın", "edit.presets": "Bul", "presets.version.error": "CMakePresets sürüm 1 desteklenmiyor. Nasıl devam etmek istersiniz?", - "failed.writing.to.file": "{0} dosyasına yazılamadı" + "failed.writing.to.file": "{0} dosyasına yazılamadı", + "failed.to.watch": "{0} için izleyici oluşturulamadı: {1}" } \ No newline at end of file diff --git a/i18n/trk/src/projectStatus.i18n.json b/i18n/trk/src/projectStatus.i18n.json index 58d0c1513..a333cf8a4 100644 --- a/i18n/trk/src/projectStatus.i18n.json +++ b/i18n/trk/src/projectStatus.i18n.json @@ -24,8 +24,16 @@ "Launch": "Başlat", "Folder": "Klasör", "active.folder": "Etkin Klasör", + "configPreset.change": "Yapılandırma Ön Ayarını Değiştir", + "override.settings.applied": "Geçersiz kılma ayarları uygulandı", + "buildPreset.change": "Derleme Ön Ayarını Değiştir", + "testPreset.change": "Test Ön Ayarını Değiştir", + "packagePreset.change": "Paket Ön Ayarını Değiştir", + "workflowPreset.change": "İş Akışı Ön Ayarını Değiştir", + "kit.change": "Seti Değiştir", "set.build.target": "Derleme Hedefini Ayarla", "set.debug.target": "Hata Ayıklama Hedefini Ayarla", "set.launch.target": "Hedefi Başlat", - "select.active.folder": "Etkin Klasör Seç" + "select.active.folder": "Etkin Klasör Seç", + "set.variant": "Değişkeni ayarla" } \ No newline at end of file diff --git a/i18n/trk/src/variant.i18n.json b/i18n/trk/src/variant.i18n.json index 238e8dc73..77219d02d 100644 --- a/i18n/trk/src/variant.i18n.json +++ b/i18n/trk/src/variant.i18n.json @@ -9,6 +9,7 @@ "enable.optimizations.omit.debug": "İyileştirmeleri etkinleştir, hata ayıklama bilgilerini çıkar", "optimize.for.smallest": "En küçük ikili dosya boyutu için iyileştir", "optimize.and.debug": "İyileştirmeleri gerçekleştir VE hata ayıklama bilgilerini ekle", + "unspec.build.type": "CMake'in varsayılan derleme türünü seçmesini izin ver", "constructing": "{0} oluşturuluyor", "reloading.variants.file": "{0} varyant dosyası yeniden yükleniyor", "reloading.variants.from.settings": "Varyantlar, ayarlardan yeniden yükleniyor", diff --git a/jobs/languageSupport/sharedCode.yml b/jobs/languageSupport/sharedCode.yml index 566edc4a6..071259206 100644 --- a/jobs/languageSupport/sharedCode.yml +++ b/jobs/languageSupport/sharedCode.yml @@ -44,9 +44,9 @@ jobs: - checkout: self - checkout: VS-Platform - task: UseNode@1 - displayName: "Use Node 16.18" + displayName: "Use Node 18.x" inputs: - version: "16.18" + version: "18.x" - script: npm install displayName: "npm install" workingDirectory: $(Build.SourcesDirectory)/vscode-cmake-tools/tools/pr-creator diff --git a/jobs/loc/TranslationsImportExport.yml b/jobs/loc/TranslationsImportExport.yml index f1a1e84e6..99d634c1d 100644 --- a/jobs/loc/TranslationsImportExport.yml +++ b/jobs/loc/TranslationsImportExport.yml @@ -58,6 +58,18 @@ extends: - task: CmdLine@2 inputs: script: 'yarn run translations-export' + + # Requires Azure client 2.x + - task: AzureCLI@2 + displayName: 'Set OneLocBuildToken' + enabled: true + inputs: + azureSubscription: '$(AzureSubscription)' # Azure DevOps service connection + scriptType: 'pscore' + scriptLocation: 'inlineScript' + inlineScript: | + $token = az account get-access-token --query accessToken --resource $(AzureGuid) -o tsv + Write-Host "##vso[task.setvariable variable=AzDO.OneLocBuildToken;issecret=true]${token}" - task: OneLocBuild@2 env: @@ -68,7 +80,7 @@ extends: isCreatePrSelected: false prSourceBranchPrefix: 'locfiles' packageSourceAuth: 'patAuth' - patVariable: '$(OneLocBuildPat)' + patVariable: '$(AzDO.OneLocBuildToken)' LclSource: lclFilesfromPackage LclPackageId: 'LCL-JUNO-PROD-VCMAKE' lsBuildXLocPackageVersion: '7.0.30510' diff --git a/jobs/prerelease.yml b/jobs/prerelease.yml index 4a0074495..d7bd52f27 100644 --- a/jobs/prerelease.yml +++ b/jobs/prerelease.yml @@ -59,4 +59,43 @@ extends: - checkout: self clean: true fetchTags: false - - template: /jobs/shared/build.yml@self \ No newline at end of file + - task: PowerShell@2 + displayName: Update ReleaseVersion for pre-release builds + condition: eq(variables.IsPreRelease, '1') + inputs: + targetType: inline + script: | + # + # Query the Marketplace for the latest version of CMake Tools + # https://github.com/microsoft/vscode/blob/main/src/vs/platform/extensionManagement/common/extensionGalleryService.ts + # + $uri = 'https://marketplace.visualstudio.com/_apis/public/gallery/extensionquery' + $contentType = 'application/json' + $headers = @{ + "Accept" = "application/json; api-version=3.0-preview" + } + $data = '{"filters": [{"criteria": [{"filterType": 7, "value": "ms-vscode.cmake-tools"}]}], "flags": 529}' + $response = Invoke-WebRequest -Method 'POST' -Uri $uri -UseBasicParsing -ContentType $contentType -Headers $headers -Body $data + $newVersion = '' + if ($response.StatusCode.Equals(200)) { + $result = $response.Content | ConvertFrom-Json + # Check the $result.results[0].extensions.versions.properties for the 'Microsoft.VisualStudio.Code.PreRelease' key to make sure it's true, + # if not, we need to bump the .Minor version and reset .Build to 0 + $index = $result.results[0].extensions.versions.properties.key.IndexOf("Microsoft.VisualStudio.Code.PreRelease") + $isPreRelease = "false" + if ($index -ge 0) { + $isPreRelease = $result.results[0].extensions.versions.properties.value[$index] + } + $v = [System.Version]::Parse($result.results[0].extensions.versions.version) + if ($isPreRelease.Equals('true')) { + $newVersion = [System.Version]::new($v.Major, $v.Minor, $v.Build + 1).ToString() + } else { + $newVersion = [System.Version]::new($v.Major, $v.Minor + 1, 0).ToString() + } + } + Write-Host "New version is: $newVersion" + Write-Host "##vso[task.setvariable variable=ReleaseVersion]$newVersion" + ignoreLASTEXITCODE: true + - template: /jobs/shared/build.yml@self + parameters: + ReleaseVersion: $(ReleaseVersion) \ No newline at end of file diff --git a/jobs/release.yml b/jobs/release.yml index 1d2afb4ca..4f3ffed74 100644 --- a/jobs/release.yml +++ b/jobs/release.yml @@ -36,7 +36,7 @@ resources: repositories: - repository: self type: git - ref: refs/heads/main + ref: refs/heads/rel - repository: MicroBuildTemplate type: git name: 1ESPipelineTemplates/MicroBuildTemplate diff --git a/jobs/release/prerelease.yml b/jobs/release/prerelease.yml new file mode 100644 index 000000000..64d8313fb --- /dev/null +++ b/jobs/release/prerelease.yml @@ -0,0 +1,69 @@ +# ================================================================================== +# Release Pipeline for pre-release +# ================================================================================== + +name: PrereleaseRelease-$(Date:yyyyMMdd).$(Rev:r) +trigger: none + +resources: + repositories: + - repository: 1ESPipelineTemplates + type: git + name: 1ESPipelineTemplates/1ESPipelineTemplates + ref: refs/tags/release + pipelines: + - pipeline: BuildPrereleasePipeline + source: '\VC\VSCode\CMakeTools\vscode-cmake-tools - pre-release [YAML]' + trigger: true + +extends: + template: v1/1ES.Official.PipelineTemplate.yml@1ESPipelineTemplates + parameters: + pool: + name: VSEngSS-MicroBuild2022-1ES + + stages: + - stage: release + jobs: + - job: release + templateContext: + type: releaseJob + isProduction: true + inputs: + - input: pipelineArtifact + pipeline: BuildPrereleasePipeline + artifactName: vsix + targetPath: $(Build.StagingDirectory)\vsix + + steps: + - powershell: | + $newVersion = Get-Content -Path $(Build.StagingDirectory)\vsix\version.txt + Write-Host "New version is: $newVersion" + + $str = Get-Date -Format "yyMMdd-HHmm" + Write-Host "##vso[build.updatebuildnumber]$newVersion - $str" + ignoreLASTEXITCODE: true + displayName: 'Set the release name' + - task: NodeTool@0 + displayName: 'Use Node 18.x' + inputs: + versionSpec: 18.x + - task: Npm@0 + displayName: 'install vsce' + inputs: + arguments: '-g vsce' + - task: AzureCLI@2 + displayName: 'Generate AAD_TOKEN' + inputs: + azureSubscription: '$(AzureSubscription)' + scriptType: ps + scriptLocation: inlineScript + inlineScript: | + $aadToken = az account get-access-token --query accessToken --resource $(AzureGuid) -o tsv + Write-Host "##vso[task.setvariable variable=AAD_TOKEN;issecret=true]$aadToken" + - script: | + vsce publish --packagePath $(Build.StagingDirectory)\vsix\cmake-tools.vsix --pre-release + displayName: 'Publish the VSIX' + env: + VSCE_PAT: $(AAD_TOKEN) + diff --git a/jobs/release/release.yml b/jobs/release/release.yml new file mode 100644 index 000000000..bf9752230 --- /dev/null +++ b/jobs/release/release.yml @@ -0,0 +1,93 @@ +# ================================================================================== +# Release Pipeline for release +# ================================================================================== + +name: OfficialRelease-$(Date:yyyyMMdd).$(Rev:r) +trigger: none + +resources: + repositories: + - repository: 1ESPipelineTemplates + type: git + name: 1ESPipelineTemplates/1ESPipelineTemplates + ref: refs/tags/release + pipelines: + - pipeline: BuildReleasePipeline + source: '\VC\VSCode\CMakeTools\vscode-cmake-tools - release [YAML]' + trigger: true + +extends: + template: v1/1ES.Official.PipelineTemplate.yml@1ESPipelineTemplates + parameters: + pool: + name: VSEngSS-MicroBuild2022-1ES + + stages: + - stage: Validate + jobs: + - job: UpdateBuildNumber + displayName: Update Build Number + steps: + - download: BuildReleasePipeline + artifact: vsix + - powershell: | + $newVersion = Get-Content -Path $(Pipeline.Workspace)\BuildReleasePipeline\vsix\version.txt + Write-Host "New version is: $newVersion" + + $str = Get-Date -Format "yyMMdd-HHmm" + Write-Host "##vso[build.updatebuildnumber]$newVersion - $str" + ignoreLASTEXITCODE: true + displayName: "Set the release name" + - job: WaitForValidation + displayName: Wait for vscode-cmake-tools validation + dependsOn: UpdateBuildNumber + pool: server + steps: + - task: ManualValidation@0 + displayName: "Manual Validation" + inputs: + notifyUsers: $(EmailAddress) + instructions: | + Download and test the vsix with the matching version number from the latest release build: $(BuildPipelineURL) + + The version should match the name of this release. + + - stage: Release + dependsOn: Validate + condition: succeeded('Validate') + jobs: + - job: ReleaseCMakeTools + displayName: Release vscode-cmake-tools Tools + templateContext: + type: releaseJob + isProduction: true + inputs: + - input: pipelineArtifact + pipeline: BuildReleasePipeline + artifactName: vsix + targetPath: $(Build.StagingDirectory)\vsix + + steps: + - task: NodeTool@0 + displayName: 'Use Node 18.x' + inputs: + versionSpec: 18.x + - task: Npm@0 + displayName: 'install vsce' + inputs: + arguments: '-g vsce' + - task: AzureCLI@2 + displayName: 'Generate AAD_TOKEN' + inputs: + azureSubscription: '$(AzureSubscription)' + scriptType: ps + scriptLocation: inlineScript + inlineScript: | + $aadToken = az account get-access-token --query accessToken --resource $(AzureGuid) -o tsv + Write-Host "##vso[task.setvariable variable=AAD_TOKEN;issecret=true]$aadToken" + - script: | + vsce publish --packagePath $(Build.StagingDirectory)\vsix\cmake-tools.vsix + displayName: 'Publish the VSIX' + env: + VSCE_PAT: $(AAD_TOKEN) + diff --git a/jobs/shared/build.yml b/jobs/shared/build.yml index d9467a10e..f3d1b5e9f 100644 --- a/jobs/shared/build.yml +++ b/jobs/shared/build.yml @@ -13,9 +13,9 @@ steps: signType: $(SignType) zipSources: false - task: NodeTool@0 - displayName: Use Node 16.x + displayName: Use Node 18.x inputs: - versionSpec: 16.x + versionSpec: 18.x - task: geeklearningio.gl-vsts-tasks-yarn.yarn-installer-task.YarnInstaller@3 displayName: Use Yarn 1.x - task: CmdLine@2 @@ -26,43 +26,6 @@ steps: displayName: npm install VSCE inputs: arguments: -g vsce -- task: PowerShell@2 - displayName: Update ReleaseVersion for pre-release builds - condition: eq(variables.IsPreRelease, '1') - inputs: - targetType: inline - script: | - # - # Query the Marketplace for the latest version of CMake Tools - # https://github.com/microsoft/vscode/blob/main/src/vs/platform/extensionManagement/common/extensionGalleryService.ts - # - $uri = 'https://marketplace.visualstudio.com/_apis/public/gallery/extensionquery' - $contentType = 'application/json' - $headers = @{ - "Accept" = "application/json; api-version=3.0-preview" - } - $data = '{"filters": [{"criteria": [{"filterType": 7, "value": "ms-vscode.cmake-tools"}]}], "flags": 529}' - $response = Invoke-WebRequest -Method 'POST' -Uri $uri -UseBasicParsing -ContentType $contentType -Headers $headers -Body $data - $newVersion = '' - if ($response.StatusCode.Equals(200)) { - $result = $response.Content | ConvertFrom-Json - # Check the $result.results[0].extensions.versions.properties for the 'Microsoft.VisualStudio.Code.PreRelease' key to make sure it's true, - # if not, we need to bump the .Minor version and reset .Build to 0 - $index = $result.results[0].extensions.versions.properties.key.IndexOf("Microsoft.VisualStudio.Code.PreRelease") - $isPreRelease = "false" - if ($index -ge 0) { - $isPreRelease = $result.results[0].extensions.versions.properties.value[$index] - } - $v = [System.Version]::Parse($result.results[0].extensions.versions.version) - if ($isPreRelease.Equals('true')) { - $newVersion = [System.Version]::new($v.Major, $v.Minor, $v.Build + 1).ToString() - } else { - $newVersion = [System.Version]::new($v.Major, $v.Minor + 1, 0).ToString() - } - } - Write-Host "New version is: $newVersion" - Write-Host "##vso[task.setvariable variable=ReleaseVersion]$newVersion" - ignoreLASTEXITCODE: true - task: PowerShell@2 displayName: Set build name inputs: diff --git a/package.json b/package.json index be25f8c1a..ecc789b6a 100644 --- a/package.json +++ b/package.json @@ -2437,6 +2437,11 @@ "short": "RelWithDebInfo", "long": "%cmake-tools.configuration.cmake.defaultVariants.buildType.reldeb.long%", "buildType": "RelWithDebInfo" + }, + "unspecified": { + "short": "Unspecified", + "long": "%cmake-tools.configuration.cmake.defaultVariants.buildType.unspecified.long%", + "buildType": "Unspecified" } } } @@ -2571,7 +2576,7 @@ }, "cmake.configureOnOpen": { "type": "boolean", - "default": null, + "default": true, "description": "%cmake-tools.configuration.cmake.configureOnOpen.description%", "scope": "resource", "tags": [ @@ -2587,7 +2592,7 @@ "cmake.deleteBuildDirOnCleanConfigure": { "type": "boolean", "default": false, - "description": "%cmake-tools.configuration.cmake.deleteBuildDirOnCleanCconfigure.description%", + "description": "%cmake-tools.configuration.cmake.deleteBuildDirOnCleanConfigure.description%", "scope": "resource" }, "cmake.setBuildTypeOnMultiConfig": { @@ -3479,12 +3484,14 @@ "enum": [ "focus", "always", - "never" + "never", + "error" ], "enumDescriptions": [ "%cmake-tools.configuration.cmake.revealLog.focus.description%", "%cmake-tools.configuration.cmake.revealLog.always.description%", - "%cmake-tools.configuration.cmake.revealLog.never.description%" + "%cmake-tools.configuration.cmake.revealLog.never.description%", + "%cmake-tools.configuration.cmake.revealLog.onError.description%" ], "description": "%cmake-tools.configuration.cmake.revealLog.description%" }, @@ -3505,6 +3512,17 @@ "description": "%cmake-tools.configuration.cmake.useCMakePresets.description%", "scope": "resource" }, + "cmake.useVsDeveloperEnvironment": { + "type": "string", + "enum": [ + "always", + "never", + "auto" + ], + "default": "auto", + "description": "%cmake-tools.configuration.cmake.useVsDeveloperEnvironment.description%", + "scope": "resource" + }, "cmake.allowCommentsInPresetsFile": { "type": "boolean", "default": false, @@ -3579,12 +3597,12 @@ "command": "cmake.buildWithTarget" }, { - "key": "ctrl+f5", + "key": "shift+f5", "command": "cmake.debugTarget", "when": "!inDebugMode && inCMakeProject && !cmake:hideDebugCommand && cmake:enableFullFeatureSet" }, { - "key": "shift+f5", + "key": "ctrl+f5", "command": "cmake.launchTarget", "when": "!inDebugMode && !cmake:hideDebugCommand && cmake:enableFullFeatureSet" } @@ -3684,6 +3702,7 @@ "@types/chai-string": "^1.4.2", "@types/js-yaml": "^4.0.0", "@types/json5": "~0.0.30", + "@types/lodash": "4.14.202", "@types/mocha": "^8.2.2", "@types/node": "~14.14.28", "@types/rimraf": "^3.0.0", @@ -3750,7 +3769,8 @@ "vscode-tas-client": "^0.1.45", "which": "~2.0.2", "xml2js": "^0.4.23", - "uuid": "~8.3.2" + "uuid": "~8.3.2", + "lodash": "^4.17.21" }, "resolutions": { "ansi-regex": "^5.0.1", diff --git a/package.nls.json b/package.nls.json index 3c8cf232a..911a453d1 100644 --- a/package.nls.json +++ b/package.nls.json @@ -64,7 +64,7 @@ "cmake-tools.command.cmake.debugTargetAll.title": "Debug All Projects", "cmake-tools.command.cmake.launchTarget.title": "Run Without Debugging", "cmake-tools.command.cmake.launchTargetAll.title": "Run All Projects Without Debugging", - "cmake-tools.command.cmake.selectLaunchTarget.title": "Set Debug Target", + "cmake-tools.command.cmake.selectLaunchTarget.title": "Set Launch/Debug Target", "cmake-tools.command.cmake.stop.title": "Cancel Build", "cmake-tools.command.cmake.stopAll.title": "Cancel Build for All Projects", "cmake-tools.command.cmake.resetState.title": "Reset CMake Tools Extension State (For troubleshooting)", @@ -151,6 +151,7 @@ "cmake-tools.configuration.cmake.debugConfig.setupCommands.description.description": "Description of the command.", "cmake-tools.configuration.cmake.defaultVariants.overall.description": "Configure the default variant settings.", "cmake-tools.configuration.cmake.defaultVariants.buildType.description": "The build type.", + "cmake-tools.configuration.cmake.defaultVariants.buildType.unspecified.long": "Let CMake pick the default build type.", "cmake-tools.configuration.cmake.defaultVariants.buildType.debug.long": "Disable optimizations - include debug information.", "cmake-tools.configuration.cmake.defaultVariants.buildType.release.long": "Optimize for speed - exclude debug information.", "cmake-tools.configuration.cmake.defaultVariants.buildType.minsize.long": "Optimize for smallest binary size - exclude debug information.", @@ -256,8 +257,10 @@ "cmake-tools.configuration.cmake.revealLog.focus.description": "The log appears and the output channel takes the cursor focus.", "cmake-tools.configuration.cmake.revealLog.always.description": "The log appears but the output channel doesn't take the cursor focus.", "cmake-tools.configuration.cmake.revealLog.never.description": "The log neither appears nor takes the focus.", + "cmake-tools.configuration.cmake.revealLog.onError.description": "The log appears only when the build or the configuration fails.", "cmake-tools.configuration.cmake.exportCompileCommandsFile.description": "Enables exporting compile_commands.json. This only is used in Kits scenarios. In Presets scenarios, please set this by using CMakePresets.json", "cmake-tools.configuration.cmake.useCMakePresets.description": "Use CMakePresets.json to configure drive CMake configure, build, and test. When using CMakePresets.json, kits, variants, and some settings in settings.json will be ignored.", + "cmake-tools.configuration.cmake.useVsDeveloperEnvironment.description": "When using CMake Presets on Windows, use the Visual Studio environment as the parent environment. Selecting auto will only apply the Visual Studio environment when we detect a supported compiler (cl, clang, clang-cl, clang-cpp, clang++), or the Ninja generator is being used.", "cmake-tools.configuration.cmake.allowCommentsInPresetsFile.description": "Allow the use of JSON extensions such as comments in CMakePresets.json. Please note that your CMakePresets.json file may be considered invalid by other IDEs or on the command line if you use non-standard JSON.", "cmake-tools.configuration.cmake.allowUnsupportedPresetsVersions.description": "Enables the use of presets files that are using features from the versions that CMake Tools extension doesn't currently support. Unknown properties and macros will be ignored.", "cmake-tools.configuration.cmake.ignoreCMakeListsMissing.description": { diff --git a/src/cmake/cmakeExecutable.ts b/src/cmake/cmakeExecutable.ts index 06c0b19d4..a17529109 100644 --- a/src/cmake/cmakeExecutable.ts +++ b/src/cmake/cmakeExecutable.ts @@ -15,9 +15,11 @@ export interface CMakeExecutable { isServerModeSupported?: boolean; isFileApiModeSupported?: boolean; isDebuggerSupported?: boolean; + isDefaultGeneratorSupported?: boolean; version?: util.Version; minimalServerModeVersion: util.Version; minimalFileApiModeVersion: util.Version; + minimalDefaultGeneratorVersion: util.Version; } const cmakeInfo = new Map(); @@ -27,7 +29,8 @@ export async function getCMakeExecutableInformation(path: string): Promise(); - private projectController: ProjectController | undefined; + public projectController: ProjectController | undefined; public readonly cTestController: CTestDriver; public readonly cPackageController: CPackDriver; public readonly workflowController: WorkflowDriver; @@ -266,11 +270,32 @@ export class CMakeProject { return undefined; } log.debug(localize('resolving.config.preset', 'Resolving the selected configure preset')); - const expandedConfigurePreset = await preset.expandConfigurePreset(this.folderPath, - configurePreset, - lightNormalizePath(this.folderPath || '.'), - this.sourceDir, - true); + + // Need to double check this preset is valid - We want to use the original unexpanded preset file to apply the dev env in expandConfigurePreset, + // so we have to first check if the preset is valid in expandedPresets since we won't be expanding the whole file here, only the path up for this preset + if (!preset.getPresetByName(preset.configurePresets(this.folderPath), configurePreset) && !preset.getPresetByName(preset.userConfigurePresets(this.folderPath), configurePreset)) { + return undefined; + } + + const workspaceFolder = lightNormalizePath(this.folderPath || '.'); + let expandedConfigurePreset: preset.ConfigurePreset | undefined; + + const presetInherits = await preset.getConfigurePresetInherits(this.folderPath, configurePreset, true, true); + if (presetInherits) { + // Modify the preset parent environment, in certain cases, to apply the Vs Dev Env on top of process.env. + await preset.tryApplyVsDevEnv(presetInherits, workspaceFolder, this._sourceDir); + + expandedConfigurePreset = await preset.expandConfigurePresetVariables( + presetInherits, + this.folderPath, + presetInherits.name, + workspaceFolder, + this.sourceDir, + true, + true + ); + } + if (!expandedConfigurePreset) { log.error(localize('failed.resolve.config.preset', 'Failed to resolve configure preset: {0}', configurePreset)); return undefined; @@ -286,6 +311,11 @@ export class CMakeProject { } } + preset.cacheExpandedPreset(this.folderPath, expandedConfigurePreset, "configurePresets"); + + // Make sure we pass CMakeDriver the preset defined env as well as the parent env + expandedConfigurePreset.environment = EnvironmentUtils.mergePreserveNull([expandedConfigurePreset.__parentEnvironment, expandedConfigurePreset.environment]); + return expandedConfigurePreset; } @@ -298,6 +328,7 @@ export class CMakeProject { if (configurePreset) { const expandedConfigurePreset: preset.ConfigurePreset | undefined = await this.expandConfigPresetbyName(configurePreset); + if (!expandedConfigurePreset) { await this.resetPresets(drv); return; @@ -352,7 +383,9 @@ export class CMakeProject { return undefined; } log.debug(localize('resolving.build.preset', 'Resolving the selected build preset')); - const expandedBuildPreset = await preset.expandBuildPreset(this.folderPath, + let expandedBuildPreset: preset.BuildPreset | undefined; + const presetInherits = await preset.getBuildPresetInherits( + this.folderPath, buildPreset, lightNormalizePath(this.folderPath || '.'), this.sourceDir, @@ -360,10 +393,26 @@ export class CMakeProject { this.getPreferredGeneratorName(), true, this.configurePreset?.name); + if (presetInherits) { + expandedBuildPreset = await preset.expandBuildPresetVariables( + presetInherits, + buildPreset, + lightNormalizePath(this.folderPath || '.'), + this.sourceDir); + } + if (!expandedBuildPreset) { log.error(localize('failed.resolve.build.preset', 'Failed to resolve build preset: {0}', buildPreset)); return undefined; } + + if (expandedBuildPreset.name !== preset.defaultBuildPreset.name) { + preset.cacheExpandedPreset(this.folderPath, expandedBuildPreset, "buildPresets"); + } + + // Make sure we pass CMakeDriver the preset defined env as well as the parent env + expandedBuildPreset.environment = EnvironmentUtils.mergePreserveNull([expandedBuildPreset.__parentEnvironment, expandedBuildPreset.environment]); + return expandedBuildPreset; } @@ -426,13 +475,22 @@ export class CMakeProject { return undefined; } log.debug(localize('resolving.test.preset', 'Resolving the selected test preset')); - const expandedTestPreset = await preset.expandTestPreset(this.folderPath, + let expandedTestPreset: preset.TestPreset | undefined; + const presetInherits = await preset.getTestPresetInherits( + this.folderPath, testPreset, lightNormalizePath(this.folderPath || '.'), this.sourceDir, this.getPreferredGeneratorName(), true, this.configurePreset?.name); + if (presetInherits) { + expandedTestPreset = await preset.expandTestPresetVariables( + presetInherits, + testPreset, + lightNormalizePath(this.folderPath || '.'), + this.sourceDir); + } if (!expandedTestPreset) { log.error(localize('failed.resolve.test.preset', 'Failed to resolve test preset: {0}', testPreset)); return undefined; @@ -441,6 +499,14 @@ export class CMakeProject { log.error(localize('configurePreset.not.set.test.preset', '{0} is not set in test preset: {1}', "\"configurePreset\"", testPreset)); return undefined; } + + if (expandedTestPreset.name !== preset.defaultTestPreset.name) { + preset.cacheExpandedPreset(this.folderPath, expandedTestPreset, "testPresets"); + } + + // Make sure we pass CMakeDriver the preset defined env as well as the parent env + expandedTestPreset.environment = EnvironmentUtils.mergePreserveNull([expandedTestPreset.__parentEnvironment, expandedTestPreset.environment]); + return expandedTestPreset; } @@ -503,13 +569,22 @@ export class CMakeProject { return undefined; } log.debug(localize('resolving.package.preset', 'Resolving the selected package preset')); - const expandedPackagePreset = await preset.expandPackagePreset(this.folderPath, + let expandedPackagePreset: preset.TestPreset | undefined; + const presetInherits = await preset.getPackagePresetInherits( + this.folderPath, packagePreset, lightNormalizePath(this.folderPath || '.'), this.sourceDir, this.getPreferredGeneratorName(), true, this.configurePreset?.name); + if (presetInherits) { + expandedPackagePreset = await preset.expandPackagePresetVariables( + presetInherits, + packagePreset, + lightNormalizePath(this.folderPath || '.'), + this.sourceDir); + } if (!expandedPackagePreset) { log.error(localize('failed.resolve.package.preset', 'Failed to resolve package preset: {0}', packagePreset)); return undefined; @@ -518,6 +593,14 @@ export class CMakeProject { log.error(localize('configurePreset.not.set.package.preset', '{0} is not set in package preset: {1}', "\"configurePreset\"", packagePreset)); return undefined; } + + if (expandedPackagePreset.name !== preset.defaultPackagePreset.name) { + preset.cacheExpandedPreset(this.folderPath, expandedPackagePreset, "packagePresets"); + } + + // Make sure we pass CMakeDriver the preset defined env as well as the parent env + expandedPackagePreset.environment = EnvironmentUtils.mergePreserveNull([expandedPackagePreset.__parentEnvironment, expandedPackagePreset.environment]); + return expandedPackagePreset; } @@ -580,7 +663,7 @@ export class CMakeProject { return undefined; } log.debug(localize('resolving.workflow.preset', 'Resolving the selected workflow preset')); - const expandedWorkflowPreset = await preset.expandWorkflowPreset(this.folderPath, + const expandedWorkflowPreset = await preset.getWorkflowPresetInherits(this.folderPath, workflowPreset, lightNormalizePath(this.folderPath || '.'), this.sourceDir, @@ -823,18 +906,20 @@ export class CMakeProject { } private getPreferredGenerators(): CMakeGenerator[] { - // User can override generator with a setting + const userPreferred: CMakeGenerator[] = this.workspaceContext.config.preferredGenerators + .map(g => ({ name: g })); + + // The generator setting is placed at the front of user preferred generators const userGenerator = this.workspaceContext.config.generator; if (userGenerator) { log.debug(localize('using.user.generator', 'Using generator from user configuration: {0}', userGenerator)); - return [{ + userPreferred.unshift({ name: userGenerator, platform: this.workspaceContext.config.platform || undefined, toolset: this.workspaceContext.config.toolset || undefined - }]; + }); } - const userPreferred = this.workspaceContext.config.preferredGenerators.map(g => ({ name: g })); return userPreferred; } @@ -848,7 +933,7 @@ export class CMakeProject { * configure. This should be called by a derived driver before any * configuration tasks are run */ - public async cmakePreConditionProblemHandler(e: CMakePreconditionProblems, isConfiguring: boolean, config?: ConfigurationReader): Promise { + public async cmakePreConditionProblemHandler(e: CMakePreconditionProblems, isConfiguring: boolean, config?: ConfigurationReader): Promise { let telemetryEvent: string | undefined; const telemetryProperties: telemetry.Properties = {}; @@ -941,9 +1026,14 @@ export class CMakeProject { if (!isConfiguring) { telemetry.logEvent(telemetryEvent, telemetryProperties); - return vscode.commands.executeCommand('cmake.configure'); + await vscode.commands.executeCommand('cmake.configure'); + return true; + } else { + await this.reloadCMakeDriver(); } } + + return true; } else { telemetryProperties["missingCMakeListsUserAction"] = "cancel-browse"; } @@ -959,7 +1049,8 @@ export class CMakeProject { // This project folder can go through various changes while executing this function // that could be relevant to the partial/full feature set view. // This is a good place for an update. - return updateFullFeatureSet(); + await updateFullFeatureSet(); + return false; } /** @@ -1067,7 +1158,16 @@ export class CMakeProject { this.statusMessage.set(localize('ready.status', 'Ready')); } - await drv.setVariant(this.variantManager.activeVariantOptions, this.variantManager.activeKeywordSetting); + // Set variant in driver when not using presets + if (!this.useCMakePresets) { + // Make sure the variant manager is initialized first + if (!this.variantManager.hasInitialized()) { + await this.variantManager.initialize(this.folderName); + } + + await drv.setVariant(this.variantManager.activeVariantOptions, this.variantManager.activeKeywordSetting); + } + const newTargetName = this.defaultBuildTarget || (this.useCMakePresets ? this.targetsInPresetName : drv.allTargetName); if (this.targetName.value !== newTargetName) { this.targetName.set(newTargetName); @@ -1144,14 +1244,28 @@ export class CMakeProject { log.debug(localize('second.phase.init', 'Starting CMake Tools second-phase init')); await this.setSourceDir(await util.normalizeAndVerifySourceDir(sourceDirectory, CMakeDriver.sourceDirExpansionOptions(this.workspaceContext.folder.uri.fsPath))); this.doStatusChange(this.workspaceContext.config.options); - // Start up the variant manager - await this.variantManager.initialize(this.folderName); - // Set the status bar message - this.activeVariant.set(this.variantManager.activeVariantOptions.short); // Restore the debug target this._launchTargetName.set(this.workspaceContext.state.getLaunchTargetName(this.folderName, this.isMultiProjectFolder) || ''); // Hook up event handlers + this.cTestController.onTestingEnabledChanged(enabled => this._ctestEnabled.set(enabled)); + this.cPackageController.onPackagingEnabledChanged(enabled => this._cpackEnabled.set(enabled)); + + this.statusMessage.set(localize('ready.status', 'Ready')); + + this.kitsController = await KitsController.init(this); + this.presetsController = await PresetsController.init(this, this.kitsController, this.isMultiProjectFolder); + + await this.doUseCMakePresetsChange(); + + // Only initialize the variant manager when not using presets + if (!this.useCMakePresets) { + // Start up the variant manager + await this.variantManager.initialize(this.folderName); + // Set the status bar message + this.activeVariant.set(this.variantManager.activeVariantOptions.short); + } + // Listen for the variant to change this.variantManager.onActiveVariantChanged(() => { log.debug(localize('active.build.variant.changed', 'Active build variant changed')); @@ -1164,15 +1278,6 @@ export class CMakeProject { } }); }); - this.cTestController.onTestingEnabledChanged(enabled => this._ctestEnabled.set(enabled)); - this.cPackageController.onPackagingEnabledChanged(enabled => this._cpackEnabled.set(enabled)); - - this.statusMessage.set(localize('ready.status', 'Ready')); - - this.kitsController = await KitsController.init(this); - this.presetsController = await PresetsController.init(this, this.kitsController, this.isMultiProjectFolder); - - await this.doUseCMakePresetsChange(); this.disposables.push(this.onPresetsChanged(() => this.doUseCMakePresetsChange())); this.disposables.push(this.onUserPresetsChanged(() => this.doUseCMakePresetsChange())); @@ -1272,11 +1377,7 @@ export class CMakeProject { return false; } - private refreshLaunchEnvironment: boolean = false; async setKit(kit: Kit | null) { - if (!this.activeKit || (kit && this.activeKit.name !== kit.name)) { - this.refreshLaunchEnvironment = true; - } this._activeKit = kit; if (kit) { log.debug(localize('injecting.new.kit', 'Injecting new Kit into CMake driver')); @@ -1526,12 +1627,15 @@ export class CMakeProject { async configureInternal(trigger: ConfigureTrigger = ConfigureTrigger.api, extraArgs: string[] = [], type: ConfigureType = ConfigureType.Normal, debuggerInformation?: DebuggerInformation): Promise { const drv: CMakeDriver | null = await this.getCMakeDriverInstance(); + // Don't show a progress bar when the extension is using Cache for configuration. // Using cache for configuration happens only one time. if (drv && drv.shouldUseCachedConfiguration(trigger)) { const result: ConfigureResult = await drv.configure(trigger, []); if (result.result === 0) { await this.refreshCompileDatabase(drv.expansionOptions); + } else { + log.showChannel(true); } await this.cTestController.refreshTests(drv); this.onReconfiguredEmitter.fire(); @@ -1543,7 +1647,7 @@ export class CMakeProject { return { result: -1, resultType: ConfigureResultType.NoCache }; } - return vscode.window.withProgress( + const res = await vscode.window.withProgress( { location: vscode.ProgressLocation.Window, title: localize('configuring.project', 'Configuring project'), @@ -1551,7 +1655,12 @@ export class CMakeProject { }, async (progress, cancel) => { progress.report({ message: localize('preparing.to.configure', 'Preparing to configure') }); + const cancelInformation: ConfigureCancelInformation = { + canceled: false + }; cancel.onCancellationRequested(() => { + // We need to update the canceled information by reference before starting the cancel to ensure it's updated before the process is cancelled. + cancelInformation.canceled = true; rollbar.invokeAsync(localize('stop.on.cancellation', 'Stop on cancellation'), () => this.cancelConfiguration()); }); @@ -1560,6 +1669,8 @@ export class CMakeProject { // if there is a debugger information, we are debugging. Set up a listener for stopping a cmake debug session. if (debuggerInformation) { const trackerFactoryDisposable = vscode.debug.registerDebugAdapterTrackerFactory("cmake", new DebugTrackerFactory(async () => { + // We need to update the canceled information by reference before starting the cancel to ensure it's updated before the process is cancelled. + cancelInformation.canceled = true; forciblyCanceled = true; await this.cancelConfiguration(); trackerFactoryDisposable.dispose(); @@ -1588,23 +1699,23 @@ export class CMakeProject { let result: ConfigureResult; await setContextAndStore(isConfiguringKey, true); if (type === ConfigureType.Cache) { - result = await drv.configure(trigger, [], consumer, debuggerInformation); + result = await drv.configure(trigger, [], consumer, cancelInformation, debuggerInformation); } else { switch (type) { case ConfigureType.Normal: - result = await drv.configure(trigger, extraArgs, consumer); + result = await drv.configure(trigger, extraArgs, consumer, cancelInformation); break; case ConfigureType.NormalWithDebugger: - result = await drv.configure(trigger, extraArgs, consumer, debuggerInformation); + result = await drv.configure(trigger, extraArgs, consumer, cancelInformation, debuggerInformation); break; case ConfigureType.Clean: - result = await drv.cleanConfigure(trigger, extraArgs, consumer); + result = await drv.cleanConfigure(trigger, extraArgs, consumer, cancelInformation); break; case ConfigureType.CleanWithDebugger: - result = await drv.cleanConfigure(trigger, extraArgs, consumer, debuggerInformation); + result = await drv.cleanConfigure(trigger, extraArgs, consumer, cancelInformation, debuggerInformation); break; case ConfigureType.ShowCommandOnly: - result = await drv.configure(trigger, extraArgs, consumer, undefined, false, true); + result = await drv.configure(trigger, extraArgs, consumer, cancelInformation, undefined, false, true); break; default: rollbar.error(localize('unexpected.configure.type', 'Unexpected configure type'), { type }); @@ -1620,7 +1731,8 @@ export class CMakeProject { if (result.result === 0) { await enableFullFeatureSet(true); await this.refreshCompileDatabase(drv.expansionOptions); - } else if (result.result !== 0 && (await this.getCMakeExecutable()).isDebuggerSupported && cmakeConfiguration.get(showDebuggerConfigurationString) && !forciblyCanceled && result.resultType === ConfigureResultType.NormalOperation) { + } else if (result.result !== 0 && (await this.getCMakeExecutable()).isDebuggerSupported && cmakeConfiguration.get(showDebuggerConfigurationString) && !forciblyCanceled && !cancelInformation.canceled && result.resultType === ConfigureResultType.NormalOperation) { + log.showChannel(true); const yesButtonTitle: string = localize( "yes.configureWithDebugger.button", "Debug" @@ -1634,8 +1746,14 @@ export class CMakeProject { .then(async chosen => { if (chosen) { if (chosen.title === yesButtonTitle) { - await this.configureInternal(ConfigureTrigger.configureFailedConfigureWithDebuggerButton, extraArgs, ConfigureType.NormalWithDebugger, { - pipeName: getDebuggerPipeName() + await vscode.debug.startDebugging(undefined, { + name: localize("cmake.debug.name", "CMake Debugger"), + request: "launch", + type: "cmake", + cmakeDebugType: "configure", + pipeName: getDebuggerPipeName(), + trigger: ConfigureTrigger.configureFailedConfigureWithDebuggerButton, + fromCommand: true }); } else if (chosen.title === doNotShowAgainTitle) { await cmakeConfiguration.update(showDebuggerConfigurationString, false, vscode.ConfigurationTarget.Global); @@ -1664,6 +1782,11 @@ export class CMakeProject { } } ); + // check if the an error occured during the configuration + if (res.result !== 0) { + log.showChannel(true); + } + return res; } /** @@ -1753,6 +1876,10 @@ export class CMakeProject { log.debug(localize('no.kit.abort', 'No kit selected. Abort configure')); return { result: -1, resultType: ConfigureResultType.Other }; } + // Make sure variant manager has initialized before checking for variant + if (!this.variantManager.hasInitialized()) { + await this.variantManager.initialize(this.folderName); + } if (!this.variantManager.haveVariant) { progress.report({ message: localize('waiting.on.variant', 'Waiting on variant selection') }); await this.variantManager.selectVariant(); @@ -1957,6 +2084,9 @@ export class CMakeProject { buildLogger.info(localize('starting.build', 'Starting build')); await setContextAndStore(isBuildingKey, true); rc = await drv!.build(newTargets, taskConsumer, isBuildCommand); + if (rc !== 0) { + log.showChannel(true); // in case build has failed + } await setContextAndStore(isBuildingKey, false); if (rc === null) { buildLogger.info(localize('build.was.terminated', 'Build was terminated')); @@ -1987,12 +2117,15 @@ export class CMakeProject { await setContextAndStore(isBuildingKey, true); const rc = await drv!.build(newTargets, consumer, isBuildCommand); await setContextAndStore(isBuildingKey, false); + if (rc !== 0) { + log.showChannel(true); // in case build has failed + } if (rc === null) { buildLogger.info(localize('build.was.terminated', 'Build was terminated')); } else { buildLogger.info(localize('build.finished.with.code', 'Build finished with exit code {0}', rc)); } - const fileDiags: FileDiagnostic[] | undefined = drv!.config.parseBuildDiagnostics ? consumer!.compileConsumer.resolveDiagnostics(drv!.binaryDir) : []; + const fileDiags: FileDiagnostic[] | undefined = drv!.config.parseBuildDiagnostics ? await consumer!.compileConsumer.resolveDiagnostics(drv!.binaryDir, drv!.sourceDir) : []; if (fileDiags) { populateCollection(collections.build, fileDiags); } @@ -2278,6 +2411,11 @@ export class CMakeProject { */ async setVariant(name?: string) { // Make this function compatibile with return code style... + // Make sure the variant manager is initialized first + if (!this.variantManager.hasInitialized()) { + await this.variantManager.initialize(this.folderName); + } + if (await this.variantManager.selectVariant(name)) { if (this.workspaceContext.config.automaticReconfigure) { await this.configureInternal(ConfigureTrigger.setVariant, [], ConfigureType.Normal); @@ -2502,6 +2640,11 @@ export class CMakeProject { buildType = preset.getStringValueFromCacheVar(this.configurePreset.cacheVariables["CMAKE_BUILD_TYPE"]); } } else { + // Make sure the variant manager is initialized first + if (!this.variantManager.hasInitialized()) { + await this.variantManager.initialize(this.folderName); + } + buildType = this.variantManager.activeVariantOptions.buildType || null; } return buildType; @@ -2612,12 +2755,12 @@ export class CMakeProject { } /** - * Both debugTarget and launchTarget called this funciton, so it's refactored out + * Both debugTarget and launchTarget called this function, so it's refactored out * Array.concat's performance would not beat the Dict.merge a lot. * This is also the point to fixing the issue #1987 */ async getTargetLaunchEnvironment(drv: CMakeDriver | null, debugEnv?: DebuggerEnvironmentVariable[]): Promise { - const env = util.fromDebuggerEnvironmentVars(debugEnv); + let env = util.fromDebuggerEnvironmentVars(debugEnv); // Add environment variables from ConfigureEnvironment. const configureEnv = await drv?.getConfigureEnvironment(); @@ -2626,7 +2769,15 @@ export class CMakeProject { log.info(localize('launch.with.overrides', `NOTE: You are launching a target and there are some environment overrides being applied from your VS Code settings.`)); } - return EnvironmentUtils.merge([env, configureEnv]); + env = EnvironmentUtils.merge([configureEnv, env]); + + if (debugEnv) { + const options = {... await this.getExpansionOptions(), envOverride: env, penvOverride: configureEnv }; + for (const envPair of debugEnv) { + env[envPair.name] = await expandString(envPair.value, options); + } + } + return env; } /** @@ -2690,13 +2841,6 @@ export class CMakeProject { const userConfig = this.workspaceContext.config.debugConfig; Object.assign(debugConfig, userConfig); - const options = await this.getExpansionOptions(); - if (debugConfig.environment) { - for (const env of debugConfig.environment) { - env.value = await expandString(env.value, options); - } - } - const launchEnv = await this.getTargetLaunchEnvironment(drv, debugConfig.environment); debugConfig.environment = util.makeDebuggerEnvironmentVars(launchEnv); log.debug(localize('starting.debugger.with', 'Starting debugger with following configuration.'), JSON.stringify({ @@ -2735,26 +2879,7 @@ export class CMakeProject { }); private async createTerminal(executable: ExecutableTarget): Promise { - const launchBehavior = this.workspaceContext.config.launchBehavior.toLowerCase(); - if (launchBehavior !== "newterminal") { - for (const [, terminal] of this.launchTerminals) { - const creationOptions = terminal.creationOptions! as vscode.TerminalOptions; - const executablePath = creationOptions.env![this.launchTerminalTargetName]; - const terminalPath = creationOptions.env![this.launchTerminalPath]; - if (executablePath === executable.name) { - if (launchBehavior === 'breakandreuseterminal') { - terminal.sendText('\u0003'); - } - // Dispose the terminal if the User's settings for preferred terminal have changed since the current target is launched, - // or if the kit is changed, which means the environment variables are possibly updated. - if (terminalPath !== vscode.env.shell || this.refreshLaunchEnvironment) { - terminal.dispose(); - break; - } - return terminal; - } - } - } + // Create terminal options const userConfig = this.workspaceContext.config.debugConfig; const drv = await this.getCMakeDriverInstance(); const launchEnv = await this.getTargetLaunchEnvironment(drv, userConfig.environment); @@ -2768,7 +2893,25 @@ export class CMakeProject { options.env[this.launchTerminalPath] = vscode.env.shell; } - this.refreshLaunchEnvironment = false; + const launchBehavior = this.workspaceContext.config.launchBehavior.toLowerCase(); + // Check for terminal re-use + if (launchBehavior !== "newterminal") { + for (const [, terminal] of this.launchTerminals) { + const creationOptions = terminal.creationOptions! as vscode.TerminalOptions; + // If the environment has changed at all since the last run, dispose of this terminal + if (JSON.stringify(creationOptions.env) !== JSON.stringify(options.env)) { + terminal.dispose(); + break; + } + + if (launchBehavior === 'breakandreuseterminal') { + terminal.sendText('\u0003'); + } + + return terminal; + } + } + return vscode.window.createTerminal(options); } @@ -2996,7 +3139,7 @@ export class CMakeProject { if (projType === 'Library') { if (!(await fs.exists(path.join(this.sourceDir, `${fileName}.${langExt}`)))) { await fs.writeFile(path.join(this.sourceDir, `${fileName}.${langExt}`), - (langExt === "C++" ? + (langExt === "cpp" ? ([ '#include ', '', @@ -3018,7 +3161,7 @@ export class CMakeProject { } else if (projType === 'Executable') { if (!(await fs.exists(path.join(this.sourceDir, `main.${langExt}`)))) { await fs.writeFile(path.join(this.sourceDir, `main.${langExt}`), - (langExt === "C++" ? + (langExt === "cpp" ? ([ '#include ', '', @@ -3239,7 +3382,7 @@ export class CMakeProject { return { communicationMode: 'automatic', useCMakePresets: 'auto', - configureOnOpen: null + configureOnOpen: true }; } diff --git a/src/cmakeTaskProvider.ts b/src/cmakeTaskProvider.ts index 2c586749d..2a26b77b0 100644 --- a/src/cmakeTaskProvider.ts +++ b/src/cmakeTaskProvider.ts @@ -255,7 +255,8 @@ export class CMakeTaskProvider implements vscode.TaskProvider { let matchingTargetTasks: CMakeTask[]; if (presetName) { - matchingTargetTasks = buildTasks.filter(task => task.definition.preset === presetName); + matchingTargetTasks = buildTasks.filter(task => task.definition.preset === presetName + || task.definition.preset === "${command:cmake.activeBuildPresetName}"); } else { matchingTargetTasks = buildTasks.filter(task => { const taskTargets: string[] = task.definition.targets || []; @@ -432,6 +433,7 @@ export class CustomBuildTaskTerminal implements vscode.Pseudoterminal, proc.Outp telemetry.logEvent("task", {taskType: "configure", useCMakePresets: String(project.useCMakePresets)}); await this.correctTargets(project, CommandType.config); const cmakeDriver: CMakeDriver | undefined = (await project?.getCMakeDriverInstance()) || undefined; + if (cmakeDriver) { if (project.useCMakePresets && cmakeDriver.config.configureOnEdit) { log.debug(localize("configure.on.edit", 'When running configure tasks using presets, setting configureOnEdit to true can potentially overwrite the task configurations.')); @@ -439,7 +441,7 @@ export class CustomBuildTaskTerminal implements vscode.Pseudoterminal, proc.Outp this.preset = await this.resolvePresetName(this.preset, project.useCMakePresets, CommandType.config); const configPreset: preset.ConfigurePreset | undefined = await project?.expandConfigPresetbyName(this.preset); - const result = await cmakeDriver.configure(ConfigureTrigger.taskProvider, [], this, undefined, false, false, configPreset, this.options); + const result = await cmakeDriver.configure(ConfigureTrigger.taskProvider, [], this, undefined, undefined, false, false, configPreset, this.options); if (result === undefined || result === null) { this.writeEmitter.fire(localize('configure.terminated', 'Configure was terminated') + endOfLine); this.closeEmitter.fire(-1); diff --git a/src/config.ts b/src/config.ts index 98520c1c4..ee4aaa785 100644 --- a/src/config.ts +++ b/src/config.ts @@ -34,6 +34,7 @@ export type StatusBarInheritIconOptionVisibility = "visible" | "hidden" | "inher export type ProjectStatusOptionVisibility = "visible" | "hidden"; export type TouchBarOptionVisibility = "default" | "hidden"; export type UseCMakePresets = 'always' | 'never' | 'auto'; +export type UseVsDeveloperEnvironment = 'always' | 'never' | 'auto'; export interface AdvancedTouchBarConfig { configure?: TouchBarOptionVisibility; @@ -191,7 +192,7 @@ export interface ExtensionConfigurationSettings { mergedCompileCommands: string | null; copyCompileCommands: string | null; loadCompileCommands: boolean; - configureOnOpen: boolean | null; + configureOnOpen: boolean; configureOnEdit: boolean; deleteBuildDirOnCleanConfigure: boolean; skipConfigureIfCachePresent: boolean | null; @@ -208,6 +209,7 @@ export interface ExtensionConfigurationSettings { showOptionsMovedNotification: boolean; options: OptionConfig; useCMakePresets: UseCMakePresets; + useVsDeveloperEnvironment: UseVsDeveloperEnvironment; allowCommentsInPresetsFile: boolean; allowUnsupportedPresetsVersions: boolean; launchBehavior: string; @@ -428,7 +430,7 @@ export class ConfigurationReader implements vscode.Disposable { return this.configData.cpackArgs; } get configureOnOpen() { - if (util.isCodespaces() && this.configData.configureOnOpen === null) { + if (this.configData.configureOnOpen === null) { return true; } return this.configData.configureOnOpen; @@ -452,6 +454,9 @@ export class ConfigurationReader implements vscode.Disposable { get useCMakePresets(): UseCMakePresets { return this.configData.useCMakePresets; } + get useVsDeveloperEnvironment(): UseVsDeveloperEnvironment { + return this.configData.useVsDeveloperEnvironment; + } get allowCommentsInPresetsFile(): boolean { return this.configData.allowCommentsInPresetsFile; } @@ -597,7 +602,7 @@ export class ConfigurationReader implements vscode.Disposable { mergedCompileCommands: new vscode.EventEmitter(), copyCompileCommands: new vscode.EventEmitter(), loadCompileCommands: new vscode.EventEmitter(), - configureOnOpen: new vscode.EventEmitter(), + configureOnOpen: new vscode.EventEmitter(), configureOnEdit: new vscode.EventEmitter(), deleteBuildDirOnCleanConfigure: new vscode.EventEmitter(), skipConfigureIfCachePresent: new vscode.EventEmitter(), @@ -614,6 +619,7 @@ export class ConfigurationReader implements vscode.Disposable { showOptionsMovedNotification: new vscode.EventEmitter(), options: new vscode.EventEmitter(), useCMakePresets: new vscode.EventEmitter(), + useVsDeveloperEnvironment: new vscode.EventEmitter(), allowCommentsInPresetsFile: new vscode.EventEmitter(), allowUnsupportedPresetsVersions: new vscode.EventEmitter(), ignoreCMakeListsMissing: new vscode.EventEmitter(), diff --git a/src/ctest.ts b/src/ctest.ts index 109c17ad1..3df61efb3 100644 --- a/src/ctest.ts +++ b/src/ctest.ts @@ -705,7 +705,13 @@ export class CTestDriver implements vscode.Disposable { log.error(localize('ctest.error', 'There was an error running ctest to determine available test executables')); return result.retc || -3; } - this.tests = JSON.parse(result.stdout) ?? undefined; + + try { + this.tests = JSON.parse(result.stdout.slice(result.stdout.indexOf("{"))) ?? undefined; + } catch { + this.tests = undefined; + } + if (this.tests && this.tests.kind === 'ctestInfo') { this.tests.tests.forEach(test => { let testDefFile: string | undefined; diff --git a/src/debug/cmakeDebuggerTelemetry.ts b/src/debug/cmakeDebuggerTelemetry.ts index d86201430..307d740ae 100644 --- a/src/debug/cmakeDebuggerTelemetry.ts +++ b/src/debug/cmakeDebuggerTelemetry.ts @@ -1,6 +1,9 @@ import * as telemetry from "@cmt/telemetry"; -export const originatedFromLaunchConfiguration: string = "launchConfiguration"; +export enum DebugOrigin { + originatedFromLaunchConfiguration = "launchConfiguration", + originatedFromCommand = "command" +} export function logCMakeDebuggerTelemetry(origin: string, debugType: string) { telemetry.logEvent("cmakeDebugger", { diff --git a/src/debug/debugAdapterNamedPipeServerDescriptorFactory.ts b/src/debug/debugAdapterNamedPipeServerDescriptorFactory.ts index 6df9e2ec4..e16ce4132 100644 --- a/src/debug/debugAdapterNamedPipeServerDescriptorFactory.ts +++ b/src/debug/debugAdapterNamedPipeServerDescriptorFactory.ts @@ -6,7 +6,8 @@ import { executeScriptWithDebugger } from "./debuggerScriptDriver"; import * as logging from '../logging'; import * as nls from "vscode-nls"; import { fs } from "../pr"; -import { logCMakeDebuggerTelemetry, originatedFromLaunchConfiguration } from "./cmakeDebuggerTelemetry"; +import { DebugOrigin, logCMakeDebuggerTelemetry} from "./cmakeDebuggerTelemetry"; +import { ConfigureTrigger } from "@cmt/cmakeProject"; nls.config({ messageFormat: nls.MessageFormat.bundle, bundleFormat: nls.BundleFormat.standalone })(); const localize: nls.LocalizeFunc = nls.loadMessageBundle(); @@ -17,60 +18,67 @@ export class DebugAdapterNamedPipeServerDescriptorFactory implements vscode.Debu async createDebugAdapterDescriptor(session: vscode.DebugSession, _executable: vscode.DebugAdapterExecutable | undefined): Promise> { const pipeName = session.configuration.pipeName ?? getDebuggerPipeName(); + const origin = + session.configuration.fromCommand ? DebugOrigin.originatedFromCommand : DebugOrigin.originatedFromLaunchConfiguration; - // undocumented configuration field that lets us know if the session is being invoked from a command - // This should only be used from inside the extension from a command that invokes the debugger. - if (!session.configuration.fromCommand) { - const debuggerInformation: DebuggerInformation = { - pipeName, - dapLog: session.configuration.dapLog, - debuggerIsReady: () => undefined - }; + const debuggerInformation: DebuggerInformation = { + pipeName, + dapLog: session.configuration.dapLog, + debuggerIsReady: () => undefined + }; - const cmakeDebugType: "configure" | "script" | "external" = session.configuration.cmakeDebugType; - if (cmakeDebugType === "configure" || cmakeDebugType === "script") { - const promise = new Promise((resolve) => { - debuggerInformation.debuggerIsReady = resolve; - }); + const cmakeDebugType: "configure" | "script" | "external" = session.configuration.cmakeDebugType; + if (cmakeDebugType === "configure" || cmakeDebugType === "script") { + const promise = new Promise((resolve) => { + debuggerInformation.debuggerIsReady = resolve; + }); - if (cmakeDebugType === "script") { - const script = session.configuration.scriptPath; - if (!fs.existsSync(script)) { - throw new Error(localize("cmake.debug.scriptPath.does.not.exist", "The script path, \"{0}\", could not be found.", script)); + if (cmakeDebugType === "script") { + const script = session.configuration.scriptPath; + if (!fs.existsSync(script)) { + throw new Error(localize("cmake.debug.scriptPath.does.not.exist", "The script path, \"{0}\", could not be found.", script)); + } + const args: string[] = session.configuration.scriptArgs ?? []; + const env = new Map(session.configuration.scriptEnv?.map((e: {name: string; value: string}) => [e.name, e.value])) ?? new Map(); + logCMakeDebuggerTelemetry(origin, cmakeDebugType); + void executeScriptWithDebugger(script, args, env, debuggerInformation); + } else { + logCMakeDebuggerTelemetry(origin, cmakeDebugType); + + if (session.configuration.trigger && !Object.values(ConfigureTrigger).includes(session.configuration.trigger)) { + session.configuration.trigger = undefined; + } + + if (session.configuration.clean) { + if (session.configuration.configureAll) { + void extensionManager?.cleanConfigureAllWithDebuggerInternal( + debuggerInformation, + session.configuration.trigger + ); + } else { + void extensionManager?.cleanConfigureWithDebuggerInternal( + debuggerInformation, + session.configuration.folder + ); } - const args: string[] = session.configuration.scriptArgs ?? []; - const env = new Map(session.configuration.scriptEnv?.map((e: {name: string; value: string}) => [e.name, e.value])) ?? new Map(); - logCMakeDebuggerTelemetry(originatedFromLaunchConfiguration, cmakeDebugType); - void executeScriptWithDebugger(script, args, env, debuggerInformation); } else { - logCMakeDebuggerTelemetry(originatedFromLaunchConfiguration, cmakeDebugType); - if (session.configuration.clean) { - if (session.configuration.configureAll) { - void extensionManager?.cleanConfigureAllWithDebuggerInternal( - debuggerInformation - ); - } else { - void extensionManager?.cleanConfigureWithDebuggerInternal( - debuggerInformation - ); - } + if (session.configuration.configureAll) { + void extensionManager?.configureAllWithDebuggerInternal( + debuggerInformation, + session.configuration.trigger + ); } else { - if (session.configuration.configureAll) { - void extensionManager?.configureAllWithDebuggerInternal( - debuggerInformation - ); - } else { - void extensionManager?.configureWithDebuggerInternal( - debuggerInformation - ); - } + void extensionManager?.configureWithDebuggerInternal( + debuggerInformation, + session.configuration.folder, session.configuration.sourceDir, session.configuration.trigger + ); } } - - await promise; - } else if (cmakeDebugType === "external") { - logCMakeDebuggerTelemetry(originatedFromLaunchConfiguration, cmakeDebugType); } + + await promise; + } else if (cmakeDebugType === "external") { + logCMakeDebuggerTelemetry(origin, cmakeDebugType); } logger.info(localize('debugger.create.descriptor', 'Connecting debugger on named pipe: \"{0}\"', pipeName)); diff --git a/src/debug/debuggerConfigureDriver.ts b/src/debug/debuggerConfigureDriver.ts index e54cf03d5..20397c8b4 100644 --- a/src/debug/debuggerConfigureDriver.ts +++ b/src/debug/debuggerConfigureDriver.ts @@ -4,7 +4,7 @@ import * as vscode from "vscode"; export interface DebuggerInformation { pipeName: string; dapLog?: string; - debuggerIsReady?(): void; + debuggerIsReady(): void; } export function getDebuggerPipeName(): string { diff --git a/src/diagnostics/build.ts b/src/diagnostics/build.ts index 68a26449e..63ffa0534 100644 --- a/src/diagnostics/build.ts +++ b/src/diagnostics/build.ts @@ -46,7 +46,17 @@ export class CompileOutputConsumer implements OutputConsumer { } } - resolveDiagnostics(basePath: string): FileDiagnostic[] { + async resolvePath(file: string, basePaths: string[]): Promise { + for (const basePath of basePaths) { + const resolved = util.resolvePath(file, basePath); + if (await util.checkFileExists(resolved)) { + return resolved; + } + } + return util.resolvePath(file, basePaths[0] ?? ''); + } + + async resolveDiagnostics(...basePaths: string[]): Promise { const diags_by_file = new Map(); const severity_of = (p: string) => { @@ -75,13 +85,15 @@ export class CompileOutputConsumer implements OutputConsumer { link: this.compilers.gnuLD.diagnostics, IAR: this.compilers.iar.diagnostics }; - const arrs = util.objectPairs(by_source) - .filter(([source, _]) => this.config.enableOutputParsers?.includes(source.toLowerCase()) ?? false) - .map(([source, diags]) => diags.map(raw_diag => { - const filepath = util.resolvePath(raw_diag.file, basePath); + const parsers = util.objectPairs(by_source) + .filter(([source, _]) => this.config.enableOutputParsers?.includes(source.toLowerCase()) ?? false); + const arrs: FileDiagnostic[] = []; + for (const [ source, diags ] of parsers) { + for (const raw_diag of diags) { + const filepath = await this.resolvePath(raw_diag.file, basePaths); const severity = severity_of(raw_diag.severity); if (severity === undefined) { - return undefined; + continue; } const diag = new vscode.Diagnostic(raw_diag.location, raw_diag.message, severity); diag.source = source; @@ -93,17 +105,18 @@ export class CompileOutputConsumer implements OutputConsumer { } diag.relatedInformation = []; for (const rel of raw_diag.related) { - const relFilePath = vscode.Uri.file(util.resolvePath(rel.file, basePath)); + const relFilePath = vscode.Uri.file(await this.resolvePath(rel.file, basePaths)); const related = new vscode.DiagnosticRelatedInformation(new vscode.Location(relFilePath, rel.location), rel.message); diag.relatedInformation.push(related); } diags_by_file.get(filepath)!.push(diag); - return { + arrs.push({ filepath, diag - }; - }).filter(e => e !== undefined) as FileDiagnostic[]); - return ([] as FileDiagnostic[]).concat(...arrs); + }); + } + } + return arrs; } } diff --git a/src/diagnostics/collections.ts b/src/diagnostics/collections.ts index a8365d88a..237253dad 100644 --- a/src/diagnostics/collections.ts +++ b/src/diagnostics/collections.ts @@ -38,6 +38,7 @@ class LazyCollection implements vscode.Disposable { class Collections { private readonly _cmake = new LazyCollection('cmake-configure-diags'); private readonly _build = new LazyCollection('cmake-build-diags'); + private readonly _presets = new LazyCollection('cmake-presets-diags'); /** * The `DiagnosticCollection` for the CMake configure diagnostics. @@ -53,9 +54,17 @@ class Collections { return this._build.getOrCreate(); } + /** + * The `DiagnosticCollection` for presets diagnostics + */ + get presets(): vscode.DiagnosticCollection { + return this._presets.getOrCreate(); + } + reset() { this._cmake.dispose(); this._build.dispose(); + this._presets.dispose(); } } diff --git a/src/drivers/cmakeDriver.ts b/src/drivers/cmakeDriver.ts index b61de3c0b..73a91c80b 100644 --- a/src/drivers/cmakeDriver.ts +++ b/src/drivers/cmakeDriver.ts @@ -4,10 +4,11 @@ import * as path from 'path'; import * as vscode from 'vscode'; +import * as lodash from "lodash"; import { CMakeExecutable } from '@cmt/cmake/cmakeExecutable'; import * as codepages from '@cmt/codePageTable'; -import { ConfigureTrigger, DiagnosticsConfiguration } from "@cmt/cmakeProject"; +import { ConfigureCancelInformation, ConfigureTrigger, DiagnosticsConfiguration } from "@cmt/cmakeProject"; import { CompileCommand } from '@cmt/compilationDatabase'; import { ConfigurationReader, checkBuildOverridesPresent, checkConfigureOverridesPresent, checkTestOverridesPresent, checkPackageOverridesPresent, defaultNumJobs } from '@cmt/config'; import { CMakeBuildConsumer, CompileOutputConsumer } from '@cmt/diagnostics/build'; @@ -71,7 +72,7 @@ export interface ConfigureResult { resultType: ConfigureResultType; } -export type CMakePreconditionProblemSolver = (e: CMakePreconditionProblems, config?: ConfigurationReader) => Promise; +export type CMakePreconditionProblemSolver = (e: CMakePreconditionProblems, config?: ConfigurationReader) => Promise; function nullableValueToString(arg: any | null | undefined): string { return arg === null ? 'empty' : arg; @@ -214,7 +215,9 @@ export abstract class CMakeDriver implements vscode.Disposable { protected sourceDirUnexpanded: string, // The un-expanded original source directory path, where the CMakeLists.txt exists. private readonly isMultiProject: boolean, private readonly __workspaceFolder: string, - readonly preconditionHandler: CMakePreconditionProblemSolver) { + readonly preconditionHandler: CMakePreconditionProblemSolver, + private readonly usingFileApi: boolean = false + ) { this.sourceDir = this.sourceDirUnexpanded; // We have a cache of file-compilation terminals. Wipe them out when the // user closes those terminals. @@ -375,6 +378,10 @@ export abstract class CMakeDriver implements vscode.Disposable { */ private _kit: Kit | null = null; + get kit(): Kit | null { + return this._kit; + } + private _kitDetect: KitDetect | null = null; private _useCMakePresets: boolean = true; @@ -721,28 +728,33 @@ export abstract class CMakeDriver implements vscode.Disposable { log.debug(localize('cmakedriver.kit.set.to', 'CMakeDriver Kit set to {0}', kit.name)); this._kitEnvironmentVariables = await effectiveKitEnvironment(kit, this.expansionOptions); + // Place a kit preferred generator at the front of the list if (kit.preferredGenerator) { - preferredGenerators.push(kit.preferredGenerator); + preferredGenerators.unshift(kit.preferredGenerator); } // If no preferred generator is defined by the current kit or the user settings, // it's time to consider the defaults. - if (preferredGenerators.length === 0) { + if (preferredGenerators.length === 0 + && !(this.usingFileApi + && (this.cmake.version && util.versionGreaterOrEquals(this.cmake.version, this.cmake.minimalDefaultGeneratorVersion)) + && kit.name === "__unspec__") + ) { preferredGenerators.push({ name: "Ninja" }); preferredGenerators.push({ name: "Unix Makefiles" }); } - // Use the "best generator" selection logic only if the user did not define already - // in settings (via "cmake.generator") a particular generator to be used. + // If a generator is set in the "cmake.generator" setting, push it to the front + // of the "best generator" logic if (this.config.generator) { - this._generator = { + preferredGenerators.unshift({ name: this.config.generator, platform: this.config.platform || undefined, toolset: this.config.toolset || undefined - }; - } else { - this._generator = await this.findBestGenerator(preferredGenerators); + }); } + + this._generator = await this.findBestGenerator(preferredGenerators); } protected abstract doSetConfigurePreset(needsClean: boolean, cb: () => Promise): Promise; @@ -849,7 +861,7 @@ export abstract class CMakeDriver implements vscode.Disposable { } /** - * Get the current build type, according to the current selected variant. + * Get the current build type, according to the current selected preset or variant. * * This is the value passed to CMAKE_BUILD_TYPE or --config for multiconf */ @@ -1003,10 +1015,8 @@ export abstract class CMakeDriver implements vscode.Disposable { if (gen.name.toLowerCase().startsWith('xcode') && platform === 'darwin') { return gen; } - // If it is not a common generator that we can find, but it is a known cmake generator (cmakeGenerators), return it. - if (this.cmakeGenerators.indexOf(gen.name) >= 0 && !this.isCommonGenerator(gen.name)) { - return gen; - } + + // If the generator isn't found, move on to the next one continue; } else { return gen; @@ -1029,7 +1039,7 @@ export abstract class CMakeDriver implements vscode.Disposable { * Perform a clean configure. Deletes cached files before running the config * @param consumer The output consumer */ - public async cleanConfigure(trigger: ConfigureTrigger, extra_args: string[], consumer?: proc.OutputConsumer, debuggerInformation?: DebuggerInformation): Promise { + public async cleanConfigure(trigger: ConfigureTrigger, extra_args: string[], consumer?: proc.OutputConsumer, cancelInformation?: ConfigureCancelInformation, debuggerInformation?: DebuggerInformation): Promise { if (this.isConfigInProgress) { await this.preconditionHandler(CMakePreconditionProblems.ConfigureIsAlreadyRunning); return { result: -1, resultType: ConfigureResultType.ForcedCancel }; @@ -1042,7 +1052,7 @@ export abstract class CMakeDriver implements vscode.Disposable { await this.doPreCleanConfigure(); this.isConfigInProgress = false; - return this.configure(trigger, extra_args, consumer, debuggerInformation); + return this.configure(trigger, extra_args, consumer, cancelInformation, debuggerInformation); } async testCompilerVersion(program: string, cwd: string, arg: string | undefined, regexp: RegExp, captureGroup: number): Promise { @@ -1416,7 +1426,9 @@ export abstract class CMakeDriver implements vscode.Disposable { return Promise.all(expanded_flags_promises); } - async configure(trigger: ConfigureTrigger, extra_args: string[], consumer?: proc.OutputConsumer, debuggerInformation?: DebuggerInformation, withoutCmakeSettings: boolean = false, showCommandOnly?: boolean, presetOverride?: preset.ConfigurePreset, options?: proc.ExecutionOptions): Promise { + // The `cancelInformation` parameter is an object that allows for passing the `cancelled` field to be modified by reference. This allows us to better understand if a user + // manually cancelled the configure process. + async configure(trigger: ConfigureTrigger, extra_args: string[], consumer?: proc.OutputConsumer, cancelInformation?: ConfigureCancelInformation, debuggerInformation?: DebuggerInformation, withoutCmakeSettings: boolean = false, showCommandOnly?: boolean, presetOverride?: preset.ConfigurePreset, options?: proc.ExecutionOptions): Promise { // Check if the configuration is using cache in the first configuration and adjust the logging messages based on that. const shouldUseCachedConfiguration: boolean = this.shouldUseCachedConfiguration(trigger); @@ -1550,8 +1562,16 @@ export abstract class CMakeDriver implements vscode.Disposable { telemetryProperties.CppCompilerName = 'cl'; } - if (this._kit?.visualStudioArchitecture) { - telemetryProperties.VisualStudioArchitecture = this._kit?.visualStudioArchitecture; + if (this.useCMakePresets) { + const arch = presetOverride ? presetOverride.__developerEnvironmentArchitecture : this._configurePreset ? this._configurePreset.__developerEnvironmentArchitecture : undefined; + if (arch) { + telemetryProperties.VisualStudioArchitecture = arch; + } + } else { + if (this._kit?.visualStudioArchitecture) { + telemetryProperties.VisualStudioArchitecture = + this._kit?.visualStudioArchitecture; + } } const telemetryMeasures: telemetry.Measures = { @@ -1559,15 +1579,15 @@ export abstract class CMakeDriver implements vscode.Disposable { }; if (this.useCMakePresets && this.workspaceFolder) { const configurePresets = preset.configurePresets(this.workspaceFolder); - const userConfigurePresets = preset.userConfigurePresets(this.workspaceFolder); + const userConfigurePresets = lodash.differenceWith(preset.userConfigurePresets(this.workspaceFolder), configurePresets, (a, b) => a.name === b.name); const buildPresets = preset.buildPresets(this.workspaceFolder); - const userBuildPresets = preset.userBuildPresets(this.workspaceFolder); + const userBuildPresets = lodash.differenceWith(preset.userBuildPresets(this.workspaceFolder), buildPresets, (a, b) => a.name === b.name); const testPresets = preset.testPresets(this.workspaceFolder); - const userTestPresets = preset.userTestPresets(this.workspaceFolder); + const userTestPresets = lodash.differenceWith(preset.userTestPresets(this.workspaceFolder), testPresets, (a, b) => a.name === b.name); const packagePresets = preset.packagePresets(this.workspaceFolder); - const userPackagePresets = preset.userPackagePresets(this.workspaceFolder); + const userPackagePresets = lodash.differenceWith(preset.userPackagePresets(this.workspaceFolder), packagePresets, (a, b) => a.name === b.name); const workflowPresets = preset.workflowPresets(this.workspaceFolder); - const userWorkflowPresets = preset.userWorkflowPresets(this.workspaceFolder); + const userWorkflowPresets = lodash.differenceWith(preset.userWorkflowPresets(this.workspaceFolder), workflowPresets, (a, b) => a.name === b.name); telemetryMeasures['ConfigurePresets'] = configurePresets.length; telemetryMeasures['HiddenConfigurePresets'] = this.countHiddenPresets(configurePresets); telemetryMeasures['UserConfigurePresets'] = userConfigurePresets.length; @@ -1609,6 +1629,7 @@ export abstract class CMakeDriver implements vscode.Disposable { } } + telemetryProperties.Canceled = cancelInformation?.canceled ? "true" : "false"; telemetry.logEvent('configure', telemetryProperties, telemetryMeasures); return { result: retc, resultType: ConfigureResultType.NormalOperation }; @@ -1655,8 +1676,10 @@ export abstract class CMakeDriver implements vscode.Disposable { const allowBuildTypeOnMultiConfig = config.get("setBuildTypeOnMultiConfig") || false; - if (!this.isMultiConfFast || (this.isMultiConfFast && allowBuildTypeOnMultiConfig)) { - // Mutliconf generators do not need the CMAKE_BUILD_TYPE property + if ((!this.isMultiConfFast || (this.isMultiConfFast && allowBuildTypeOnMultiConfig)) && (this.currentBuildType !== "Unspecified")) { + // Mutliconf generators do not need the CMAKE_BUILD_TYPE property. + // Also, do not set CMAKE_BUILD_TYPE when the user has not + // specified the build type. settingMap.CMAKE_BUILD_TYPE = util.cmakeify(this.currentBuildType); } diff --git a/src/drivers/cmakeFileApiDriver.ts b/src/drivers/cmakeFileApiDriver.ts index 95156b9f3..49ec7bf9a 100644 --- a/src/drivers/cmakeFileApiDriver.ts +++ b/src/drivers/cmakeFileApiDriver.ts @@ -31,7 +31,6 @@ import * as nls from 'vscode-nls'; import { DebuggerInformation } from '@cmt/debug/debuggerConfigureDriver'; import { CMakeOutputConsumer, StateMessage } from '@cmt/diagnostics/cmake'; import { ConfigureTrigger } from '@cmt/cmakeProject'; -import { logCMakeDebuggerTelemetry } from '@cmt/debug/cmakeDebuggerTelemetry'; import { onConfigureSettingsChange } from '@cmt/ui/util'; nls.config({ messageFormat: nls.MessageFormat.bundle, bundleFormat: nls.BundleFormat.standalone })(); @@ -39,7 +38,7 @@ const localize: nls.LocalizeFunc = nls.loadMessageBundle(); const log = logging.createLogger('cmakefileapi-driver'); /** - * The CMake driver with FileApi of CMake >= 3.15.0 + * The CMake driver with FileApi of CMake >= 3.14.0 */ export class CMakeFileApiDriver extends CMakeDriver { @@ -53,7 +52,7 @@ export class CMakeFileApiDriver extends CMakeDriver { isMultiProject: boolean, workspaceRootPath: string, preconditionHandler: CMakePreconditionProblemSolver) { - super(cmake, config, sourceDir, isMultiProject, workspaceRootPath, preconditionHandler); + super(cmake, config, sourceDir, isMultiProject, workspaceRootPath, preconditionHandler, true); } static async create(cmake: CMakeExecutable, @@ -128,7 +127,7 @@ export class CMakeFileApiDriver extends CMakeDriver { if (cacheExists && this.generator?.name === await this.getGeneratorFromCache(this.cachePath)) { await this.loadGeneratorInformationFromCache(this.cachePath); const code_model_exist = await this.updateCodeModel(); - if (!code_model_exist && this.config.configureOnOpen === true) { + if (!code_model_exist && this.config.configureOnOpen) { await this.doConfigure([], undefined, undefined); } } else { @@ -137,7 +136,7 @@ export class CMakeFileApiDriver extends CMakeDriver { // Since this setting will prevent configure anyway (until a configure command is invoked // or build/test will trigger automatic configuring), there is no need to delete the cache now // even if this is not a project configured from outside VSCode. - if (cacheExists && this.config.configureOnOpen !== false) { + if (cacheExists && this.config.configureOnOpen) { // No need to remove the other CMake files for the generator change to work properly log.info(localize('removing', 'Removing {0}', this.cachePath)); try { @@ -149,7 +148,7 @@ export class CMakeFileApiDriver extends CMakeDriver { this._generatorInformation = this.generator; } - if (!this.generator && !this.useCMakePresets) { + if (!(this.cmake.isDefaultGeneratorSupported && this.kit?.name === '__unspec__') && !this.generator && !this.useCMakePresets) { throw new NoGeneratorError(); } @@ -170,7 +169,7 @@ export class CMakeFileApiDriver extends CMakeDriver { async doSetKit(cb: () => Promise): Promise { this._needsReconfigure = true; await cb(); - if (!this.generator) { + if (!(this.cmake.isDefaultGeneratorSupported && this.kit?.name === '__unspec__') && !this.generator) { throw new NoGeneratorError(); } } @@ -290,23 +289,9 @@ export class CMakeFileApiDriver extends CMakeDriver { await new Promise(resolve => setTimeout(resolve, 50)); } - // if there isn't a `debuggerIsReady` callback provided, this means that this invocation was - // started by a command, rather than by a launch configuration, and the debug session will start from here. - if (debuggerInformation.debuggerIsReady) { - // This cmake debug invocation came from a launch configuration. All telemetry is handled in the createDebugAdapterDescriptor handler. - debuggerInformation.debuggerIsReady(); - } else { - const cmakeDebugType = "configure"; - logCMakeDebuggerTelemetry(trigger ?? "", cmakeDebugType); - await vscode.debug.startDebugging(undefined, { - name: localize("cmake.debug.name", "CMake Debugger"), - request: "launch", - type: "cmake", - cmakeDebugType, - pipeName: debuggerInformation.pipeName, - fromCommand: true - }); - } + // This cmake debug invocation was started from a startDebugging command. + // All telemetry is handled in the createDebugAdapterDescriptor handler. + debuggerInformation.debuggerIsReady(); } } @@ -339,7 +324,8 @@ export class CMakeFileApiDriver extends CMakeDriver { private toolchainWarningProvided: boolean = false; private async updateCodeModel(binaryDir?: string): Promise { - const reply_path = this.getCMakeReplyPath(binaryDir).replace('~', process.env.HOME || "./"); + const initialReplyPath = this.getCMakeReplyPath(binaryDir); + const reply_path = process.platform === "linux" ? initialReplyPath.replace('~', process.env.HOME || "./") : initialReplyPath; const indexFile = await loadIndexFile(reply_path); if (indexFile) { this._generatorInformation = indexFile.cmake.generator; diff --git a/src/expand.ts b/src/expand.ts index 256dd8056..b3bc6fc10 100644 --- a/src/expand.ts +++ b/src/expand.ts @@ -77,6 +77,14 @@ export interface ExpansionOptions { * will be expanded. */ envOverride?: EnvironmentWithNull; + /** + * Override the values used in `${penv:var}`-style and `${penv.var}`-style expansions. + * + * Note that setting this property will disable expansion of environment + * variables for the running process. Only environment variables in this key + * will be expanded. + */ + penvOverride?: EnvironmentWithNull; /** * Variables for `${variant:var}`-style expansions. */ @@ -91,6 +99,11 @@ export interface ExpansionOptions { doNotSupportCommands?: boolean; } +export interface ExpansionErrorHandler { + errorList: [string, string][]; + tempErrorList: [string, string][]; +} + /** * Replace ${variable} references in the given string with their corresponding * values. @@ -98,11 +111,10 @@ export interface ExpansionOptions { * @param opts Options for the expansion process * @returns A string with the variable references replaced */ -export async function expandString(input: string | T, opts: ExpansionOptions): Promise { +export async function expandString(input: string | T, opts: ExpansionOptions, errorHandler?: ExpansionErrorHandler): Promise { if (typeof input !== 'string') { return input; } - const inputString = input as string; try { @@ -114,7 +126,7 @@ export async function expandString(input: string | T, opts: ExpansionOptions) let i = 0; do { // TODO: consider a full circular reference check? - const expansion = await expandStringHelper(result, opts); + const expansion = await expandStringHelper(result, opts, errorHandler); result = expansion.result; didReplacement = expansion.didReplacement; circularReference = expansion.circularReference; @@ -122,14 +134,16 @@ export async function expandString(input: string | T, opts: ExpansionOptions) } while (i < maxRecursion && opts.recursive && didReplacement && !circularReference); if (circularReference) { - log.warning(localize('circular.variable.reference', 'Circular variable reference found: {0}', circularReference)); + log.error(localize('circular.variable.reference.full', 'Circular variable reference found: {0}', circularReference)); } else if (i === maxRecursion) { log.error(localize('reached.max.recursion', 'Reached max string expansion recursion. Possible circular reference.')); + errorHandler?.tempErrorList.push([localize('max.recursion', 'Max string expansion recursion'), ""]); } return replaceAll(result, '${dollar}', '$'); } catch (e) { - log.warning(localize('exception.expanding.string', 'Exception while expanding string {0}: {1}', inputString, errorToString(e))); + log.warning(localize('exception.expanding.string.full', 'Exception while expanding string {0}: {1}', inputString, errorToString(e))); + errorHandler?.tempErrorList.push([localize('exception.expanding.string', 'Exception expanding string'), inputString]); } return input; @@ -140,7 +154,7 @@ export async function expandString(input: string | T, opts: ExpansionOptions) // as few times as possible, expanding as needed (lazy) const varValueRegexp = ".+?"; -async function expandStringHelper(input: string, opts: ExpansionOptions) { +async function expandStringHelper(input: string, opts: ExpansionOptions, errorHandler?: ExpansionErrorHandler) { const envPreNormalize = opts.envOverride ? opts.envOverride : process.env; const env = EnvironmentUtils.create(envPreNormalize); const replacements = opts.vars; @@ -161,7 +175,8 @@ async function expandStringHelper(input: string, opts: ExpansionOptions) { // Replace dollar sign at the very end of the expanding process const replacement = replacements[key]; if (!replacement) { - log.warning(localize('invalid.variable.reference', 'Invalid variable reference {0} in string: {1}', full, input)); + log.warning(localize('invalid.variable.reference.full', 'Invalid variable reference {0} in string: {1}', full, input)); + errorHandler?.tempErrorList.push([localize('invalid.variable.reference', 'Invalid variable reference'), input]); } else { subs.set(full, replacement); } @@ -198,12 +213,13 @@ async function expandStringHelper(input: string, opts: ExpansionOptions) { const varNameReplacement = mat2 ? mat2[1] : undefined; if (varNameReplacement && varNameReplacement === varName) { circularReference = `\"${varName}\" : \"${input}\"`; + errorHandler?.tempErrorList.push([localize('circular.variable.reference', 'Circular variable reference'), full]); break; } subs.set(full, replacement); } - getParentEnvSubstitutions(input, subs); + getParentEnvSubstitutions(input, subs, opts.penvOverride); if (vscode.workspace.workspaceFolders && vscode.workspace.workspaceFolders.length > 0) { const folderRegex = RegExp(`\\$\\{workspaceFolder:(${varValueRegexp})\\}`, "g"); @@ -246,7 +262,8 @@ async function expandStringHelper(input: string, opts: ExpansionOptions) { const result = await vscode.commands.executeCommand(command, opts.vars.workspaceFolder); subs.set(full, `${result}`); } catch (e) { - log.warning(localize('exception.executing.command', 'Exception while executing command {0} for string: {1} {2}', command, input, errorToString(e))); + log.warning(localize('exception.executing.command.full', 'Exception while executing command {0} for string: {1} {2}', command, input, errorToString(e))); + errorHandler?.tempErrorList.push([localize('exception.executing.command', 'Exception executing command'), input]); } } @@ -278,14 +295,24 @@ export function substituteAll(input: string, subs: Map) { return { result: finalString, didReplacement }; } -export function getParentEnvSubstitutions(input: string, subs: Map): Map { +export function getParentEnvSubstitutions(input: string, subs: Map, penvOverride?: EnvironmentWithNull): Map { const parentEnvRegex = RegExp(`\\$penv\\{(${varValueRegexp})\\}`, "g"); for (const mat of matchAll(input, parentEnvRegex)) { const full = mat[0]; const varName = mat[1]; - const replacement = fixPaths(process.env[varName]) || ''; + const replacementValue = penvOverride ? penvOverride[varName] : process.env[varName]; + const replacement = fixPaths(replacementValue === null ? undefined : replacementValue) || ''; subs.set(full, replacement); } return subs; } + +export function errorHandlerHelper(presetName: string, errorHandler?: ExpansionErrorHandler) { + if (errorHandler) { + for (const error of errorHandler.tempErrorList || []) { + errorHandler.errorList.push([error[0], `'${error[1]}' in preset '${presetName}'`]); + } + errorHandler.tempErrorList = []; + } +} diff --git a/src/extension.ts b/src/extension.ts index 832fcda27..e1626a257 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -594,62 +594,15 @@ export class ExtensionManager implements vscode.Disposable { vscode.workspace.workspaceFolders[0] === rootFolder && await scanForKitsIfNeeded(project); - let shouldConfigure = project?.workspaceContext.config.configureOnOpen; + const shouldConfigure = project?.workspaceContext.config.configureOnOpen; const hascmakelists = await util.globForFileName("CMakeLists.txt", 3, project.folderPath); - if (shouldConfigure === null && !util.isTestMode() && hascmakelists) { - interface Choice1 { - title: string; - doConfigure: boolean; - } - const chosen = await vscode.window.showInformationMessage( - localize('configure.this.project', 'Would you like to configure project {0}?', `"${rootFolder.name}"`), - {}, - { title: localize('yes.button', 'Yes'), doConfigure: true }, - { title: localize('not.now.button', 'Not now'), doConfigure: false } - ); - if (!chosen) { - // User cancelled. - shouldConfigure = null; - } else { - const persistMessage = chosen.doConfigure ? - localize('always.configure.on.open', 'Always configure projects upon opening?') : - localize('never.configure.on.open', 'Configure projects on opening?'); - const buttonMessages = chosen.doConfigure ? - [localize('yes.button', 'Yes'), localize('no.button', 'No')] : - [localize('never.button', 'Never'), localize('never.for.this.workspace.button', 'Not this workspace')]; - interface Choice2 { - title: string; - persistMode: 'user' | 'workspace'; - } - // Try to persist the user's selection to a `settings.json` - const prompt = vscode.window.showInformationMessage( - persistMessage, - {}, - { title: buttonMessages[0], persistMode: 'user' }, - { title: buttonMessages[1], persistMode: 'workspace' }) - .then(async choice => { - if (!choice) { - // Use cancelled. Do nothing. - return; - } - const config = vscode.workspace.getConfiguration(undefined, rootFolder.uri); - let configTarget = vscode.ConfigurationTarget.Global; - if (choice.persistMode === 'workspace') { - configTarget = vscode.ConfigurationTarget.WorkspaceFolder; - } - await config.update('cmake.configureOnOpen', chosen.doConfigure, configTarget); - }); - rollbar.takePromise(localize('persist.config.on.open.setting', 'Persist config-on-open setting'), {}, prompt); - shouldConfigure = chosen.doConfigure; - } - } if (!project.hasCMakeLists()) { - if (shouldConfigure === true && hascmakelists) { + if (shouldConfigure && hascmakelists) { await project.cmakePreConditionProblemHandler(CMakePreconditionProblems.MissingCMakeListsFile, false, this.workspaceConfig); } } else { - if (shouldConfigure === true) { + if (shouldConfigure) { // We've opened a new workspace folder, and the user wants us to // configure it now. log.debug(localize('configuring.workspace.on.open', 'Configuring workspace on open {0}', project.folderPath)); @@ -1286,7 +1239,15 @@ export class ExtensionManager implements vscode.Disposable { } cleanConfigureWithDebugger(folder?: vscode.WorkspaceFolder) { - return this.cleanConfigureWithDebuggerInternal({pipeName: getDebuggerPipeName()}, folder); + return vscode.debug.startDebugging(undefined, { + name: localize("cmake.debug.name", "CMake Debugger"), + request: "launch", + type: "cmake", + cmakeDebugType: "configure", + pipeName: getDebuggerPipeName(), + folder, + fromCommand: true + }); } cleanConfigureWithDebuggerInternal(debuggerInformation: DebuggerInformation, folder?: vscode.WorkspaceFolder) { @@ -1300,7 +1261,15 @@ export class ExtensionManager implements vscode.Disposable { } cleanConfigureAllWithDebugger(trigger?: ConfigureTrigger) { - return this.cleanConfigureAllWithDebuggerInternal({pipeName: getDebuggerPipeName()}, trigger); + return vscode.debug.startDebugging(undefined, { + name: localize("cmake.debug.name", "CMake Debugger"), + request: "launch", + type: "cmake", + cmakeDebugType: "configure", + pipeName: getDebuggerPipeName(), + trigger, + fromCommand: true + }); } cleanConfigureAllWithDebuggerInternal(debuggerInformation: DebuggerInformation, trigger?: ConfigureTrigger) { @@ -1315,7 +1284,17 @@ export class ExtensionManager implements vscode.Disposable { } configureWithDebugger(folder?: vscode.WorkspaceFolder, sourceDir?: string, trigger?: ConfigureTrigger) { - return this.configureWithDebuggerInternal({pipeName: getDebuggerPipeName()}, folder, undefined, sourceDir, trigger); + return vscode.debug.startDebugging(undefined, { + name: localize("cmake.debug.name", "CMake Debugger"), + request: "launch", + type: "cmake", + cmakeDebugType: "configure", + pipeName: getDebuggerPipeName(), + folder, + sourceDir, + trigger, + fromCommand: true + }); } configureWithDebuggerInternal(debuggerInformation: DebuggerInformation, folder?: vscode.WorkspaceFolder, showCommandOnly?: boolean, sourceDir?: string, trigger?: ConfigureTrigger) { @@ -1333,7 +1312,15 @@ export class ExtensionManager implements vscode.Disposable { } configureAllWithDebugger(trigger?: ConfigureTrigger) { - return this.configureAllWithDebuggerInternal({pipeName: getDebuggerPipeName()}, trigger); + return vscode.debug.startDebugging(undefined, { + name: localize("cmake.debug.name", "CMake Debugger"), + request: "launch", + type: "cmake", + cmakeDebugType: "configure", + pipeName: getDebuggerPipeName(), + trigger, + fromCommand: true + }); } configureAllWithDebuggerInternal(debuggerInformation: DebuggerInformation, trigger?: ConfigureTrigger) { @@ -2310,7 +2297,7 @@ class SchemaProvider implements vscode.TextDocumentContentProvider { console.assert(uri.path[0] === '/', "A preceeding slash is expected on schema uri path"); const fileName: string = uri.path.substr(1); const locale: string = util.getLocaleId(); - let localizedFilePath: string = path.join(util.thisExtensionPath(), "dist/schema/", locale, fileName); + let localizedFilePath: string = path.join(util.thisExtensionPath(), "dist/schema/", locale, "schemas", fileName); const fileExists: boolean = await util.checkFileExists(localizedFilePath); if (!fileExists) { localizedFilePath = path.join(util.thisExtensionPath(), "schemas", fileName); diff --git a/src/installs/visualStudio.ts b/src/installs/visualStudio.ts index ed8cd275f..430ead253 100644 --- a/src/installs/visualStudio.ts +++ b/src/installs/visualStudio.ts @@ -269,9 +269,9 @@ const msvcEnvVars = [ 'user_inputversion', 'VCIDEInstallDir', 'VCINSTALLDIR', - //'VCToolsInstallDir', - disabled temporarily as it breaks downlevel toolset selection + 'VCToolsInstallDir', 'VCToolsRedistDir', - //'VCToolsVersion', - disabled temporarily as it breaks downlevel toolset selection + 'VCToolsVersion', 'VisualStudioVersion', 'VSINSTALLDIR', 'WindowsLibPath', @@ -407,7 +407,7 @@ async function collectDevBatVars(hostArch: string, devBat: string, args: string[ } catch (err) { log.error(`Parse '${WindowsSDKVersion}' failed`); } - if (util.compareVersion(WindowsSDKVersionParsed, { major: 10, minor: 0, patch: 14393 }) >= 0) { + if (majorVersion === 14 && util.compareVersion(WindowsSDKVersionParsed, { major: 10, minor: 0, patch: 14393 }) >= 0) { const WindowsSdkDir = vars['WindowsSdkDir'] ?? ''; const existPath = vars['PATH'] ?? ''; const oldWinSdkBinPath = path.join(WindowsSdkDir, 'bin', hostArch); diff --git a/src/kit.ts b/src/kit.ts index ac5b7d0e1..c761b61e0 100644 --- a/src/kit.ts +++ b/src/kit.ts @@ -893,7 +893,7 @@ async function scanDirForClangForMSVCKits(dir: PathWithTrust, vsInstalls: VSInst const vsArch = (version?.target && version.target.triple.includes('i686-pc')) ? 'x86' : 'x64'; const archForKitName = vsArch === 'x86' ? 'x86' : 'amd64'; const clangArchPath = (vsArch === "x64") ? "x64\\" : ""; - const clangKitName: string = `Clang ${version?.version} ${clang_cli} for MSVC ${vs.installationVersion} (${install_name} - ${archForKitName})`; + const clangKitName: string = `Clang ${version?.version} ${clang_cli} - ${archForKitName} for MSVC ${vs.installationVersion} (${install_name})`; const clangExists = async () => { const exists = binPath.startsWith(`${vs.installationPath}\\VC\\Tools\\Llvm\\${clangArchPath}bin`) && await util.checkFileExists(util.lightNormalizePath(binPath)); return exists; @@ -1000,18 +1000,17 @@ export async function effectiveKitEnvironment(kit: Kit, opts?: expand.ExpansionO } let env = EnvironmentUtils.create(host_env); const kit_env = EnvironmentUtils.create(kit.environmentVariables); - const expandOptions: expand.ExpansionOptions = { - vars: {} as expand.KitContextVars, - envOverride: host_env - }; - for (const env_var of Object.keys(kit_env)) { - env[env_var] = await expand.expandString(kit_env[env_var], opts ?? expandOptions); - } - if (process.platform === 'win32') { - if (kit.visualStudio && kit.visualStudioArchitecture) { - const vs_vars = await getVSKitEnvironment(kit); - env = EnvironmentUtils.merge([env, vs_vars]); - } else { + const getVSKitEnv = process.platform === 'win32' && kit.visualStudio && kit.visualStudioArchitecture; + if (!getVSKitEnv) { + const expandOptions: expand.ExpansionOptions = { + vars: {} as expand.KitContextVars, + envOverride: host_env + }; + for (const env_var of Object.keys(kit_env)) { + env[env_var] = await expand.expandString(kit_env[env_var], opts ?? expandOptions); + } + + if (process.platform === 'win32') { const path_list: string[] = []; const cCompiler = kit.compilers?.C; /* Force add the compiler executable dir to the PATH env */ @@ -1028,6 +1027,17 @@ export async function effectiveKitEnvironment(kit: Kit, opts?: expand.ExpansionO env['PATH'] = path_list.join(';'); } } + } else { + const vs_vars = await getVSKitEnvironment(kit); + env = EnvironmentUtils.merge([env, vs_vars]); + const expandOptions: expand.ExpansionOptions = opts ? {...opts, envOverride: env, penvOverride: env } : { + vars: {} as expand.KitContextVars, + envOverride: env, + penvOverride: env + }; + for (const env_var of Object.keys(kit_env)) { + env[env_var] = await expand.expandString(kit_env[env_var], expandOptions); + } } log.debug(localize('kit.env', 'The environment for kit {0}: {1}', `'${kit.name}'`, JSON.stringify(env, null, 2))); return env; diff --git a/src/logging.ts b/src/logging.ts index c29f57d95..36b1e0564 100644 --- a/src/logging.ts +++ b/src/logging.ts @@ -23,7 +23,7 @@ enum LogLevel { Fatal, } -type RevealLogKey = 'always' | 'never' | 'focus'; +type RevealLogKey = 'always' | 'never' | 'focus' | 'error'; /** * Get the name of a logging level @@ -252,10 +252,17 @@ export class Logger { SingletonLogger.instance().clearOutputChannel(); } - showChannel() { + showChannel(error_to_show?: boolean) { const reveal_log = vscode.workspace.getConfiguration('cmake').get('revealLog', 'always'); - const should_show = (reveal_log !== 'never'); + let should_show: boolean = false; + if (reveal_log === 'always') { + should_show = true; + } + // won't show if no target information + if (reveal_log === 'error' && error_to_show !== undefined) { + should_show = error_to_show; + } const should_focus = (reveal_log === 'focus'); if (should_show) { diff --git a/src/preset.ts b/src/preset.ts index 5afe8f748..dc9dcdf43 100644 --- a/src/preset.ts +++ b/src/preset.ts @@ -1,15 +1,17 @@ /* eslint-disable no-unused-expressions */ import * as nls from 'vscode-nls'; import * as path from 'path'; +import * as vscode from "vscode"; +import * as lodash from "lodash"; import * as util from '@cmt/util'; import * as logging from '@cmt/logging'; import { execute } from '@cmt/proc'; -import { expandString, ExpansionOptions } from '@cmt/expand'; +import { errorHandlerHelper, expandString, ExpansionErrorHandler, ExpansionOptions } from '@cmt/expand'; import paths from '@cmt/paths'; import { compareVersions, VSInstallation, vsInstallations, enumerateMsvcToolsets, varsForVSInstallation, getVcVarsBatScript } from '@cmt/installs/visualStudio'; import { EnvironmentUtils, EnvironmentWithNull } from './environmentVariables'; -import { defaultNumJobs } from './config'; +import { defaultNumJobs, UseVsDeveloperEnvironment } from './config'; nls.config({ messageFormat: nls.MessageFormat.bundle, bundleFormat: nls.BundleFormat.standalone })(); const localize: nls.LocalizeFunc = nls.loadMessageBundle(); @@ -43,7 +45,7 @@ export interface Preset { condition?: Condition | boolean | null; isUserPreset?: boolean; - __vsDevEnvApplied?: boolean; // Private field to indicate if we have already applied the VS Dev Env. + __parentEnvironment?: EnvironmentWithNull; // Private field that contains the parent environment, which might be a modified VS Dev Env, or simply process.env. __expanded?: boolean; // Private field to indicate if we have already expanded this preset. __inheritedPresetCondition?: boolean; // Private field to indicate the fully evaluated inherited preset condition. __file?: PresetsFile; // Private field to indicate the file where this preset was defined. @@ -260,6 +262,9 @@ export interface ConfigurePreset extends Preset { vendor?: VendorVsSettings | VendorType; toolchainFile?: string; installDir?: string; + + // Private fields + __developerEnvironmentArchitecture?: string; // Private field to indicate which VS Dev Env architecture we're using, if VS Dev Env is used. } export interface InheritsConfigurePreset extends Preset { @@ -421,16 +426,26 @@ export const defaultWorkflowPreset: WorkflowPreset = { description: localize('default.workflow.preset.description', 'An empty workflow preset that does not add any arguments') }; -// presetsFiles are stored here because expansions require access to other presets. -// Change event emitters are in presetsController. +/** + * presetsFiles are stored here because expansions require access to other presets. + * Change event emitters are in presetsController. + * + * original*PresetsFile's are each used to keep a copy by **value**. They are used to update + * the presets files when new presets are added. + * + * *presetsFilesIncluded is used to store the original presets files with included files. + * They are used for expansion. + * + * expanded*PresetsFiles is used to cache the expanded presets files, without the VS dev env applied. + */ -// original*PresetsFile's are each used to keep a copy by **value**. They are used to update -// the presets files. non-original's are also used for caching during various expansions. // Map const originalPresetsFiles: Map = new Map(); const originalUserPresetsFiles: Map = new Map(); -const presetsFiles: Map = new Map(); -const userPresetsFiles: Map = new Map(); +const presetsPlusIncluded: Map = new Map(); +const userPresetsPlusIncluded: Map = new Map(); +const expandedPresets: Map = new Map(); +const expandedUserPresets: Map = new Map(); export function getOriginalPresetsFile(folder: string) { return originalPresetsFiles.get(folder); @@ -448,11 +463,59 @@ export function setOriginalUserPresetsFile(folder: string, presets: PresetsFile originalUserPresetsFiles.set(folder, presets); } -export function setPresetsFile(folder: string, presets: PresetsFile | undefined) { - presetsFiles.set(folder, presets); +export function setPresetsPlusIncluded(folder: string, presets: PresetsFile | undefined) { + presetsPlusIncluded.set(folder, presets); +} + +export function setUserPresetsPlusIncluded(folder: string, presets: PresetsFile | undefined) { + if (presets) { + if (presets.configurePresets) { + for (const configPreset of presets.configurePresets) { + configPreset.isUserPreset = true; + } + } + if (presets.buildPresets) { + for (const buildPreset of presets.buildPresets) { + buildPreset.isUserPreset = true; + } + } + if (presets.testPresets) { + for (const testPreset of presets.testPresets) { + testPreset.isUserPreset = true; + } + } + } + userPresetsPlusIncluded.set(folder, presets); +} + +export function setExpandedPresets(folder: string, presets: PresetsFile | undefined) { + expandedPresets.set(folder, presets); +} + +export function cacheExpandedPreset(folder: string, preset: Preset, presetType: 'configurePresets' | 'buildPresets' | 'testPresets' | 'packagePresets' | 'workflowPresets') { + const expanded = expandedPresets.get(folder); + const clonedPreset = lodash.cloneDeep(preset); + if (expanded) { + if (presetType === 'configurePresets') { + expanded.configurePresets = expanded.configurePresets?.filter(p => p.name !== clonedPreset.name); + expanded.configurePresets?.push(clonedPreset as ConfigurePreset); + } else if (presetType === "buildPresets") { + expanded.buildPresets = expanded.buildPresets?.filter(p => p.name !== clonedPreset.name); + expanded.buildPresets?.push(clonedPreset as BuildPreset); + } else if (presetType === "testPresets") { + expanded.testPresets = expanded.testPresets?.filter(p => p.name !== clonedPreset.name); + expanded.testPresets?.push(clonedPreset as TestPreset); + } else if (presetType === "packagePresets") { + expanded.packagePresets = expanded.packagePresets?.filter(p => p.name !== clonedPreset.name); + expanded.packagePresets?.push(clonedPreset as PackagePreset); + } else if (presetType === "workflowPresets") { + expanded.workflowPresets = expanded.workflowPresets?.filter(p => p.name !== clonedPreset.name); + expanded.workflowPresets?.push(clonedPreset as WorkflowPreset); + } + } } -export function setUserPresetsFile(folder: string, presets: PresetsFile | undefined) { +export function setExpandedUserPresetsFile(folder: string, presets: PresetsFile | undefined) { if (presets) { if (presets.configurePresets) { for (const configPreset of presets.configurePresets) { @@ -470,12 +533,12 @@ export function setUserPresetsFile(folder: string, presets: PresetsFile | undefi } } } - userPresetsFiles.set(folder, presets); + expandedUserPresets.set(folder, presets); } export function minCMakeVersion(folder: string) { - const min1 = presetsFiles.get(folder)?.cmakeMinimumRequired; - const min2 = userPresetsFiles.get(folder)?.cmakeMinimumRequired; + const min1 = presetsPlusIncluded.get(folder)?.cmakeMinimumRequired; + const min2 = presetsPlusIncluded.get(folder)?.cmakeMinimumRequired; if (!min1) { return min2; } @@ -486,79 +549,109 @@ export function minCMakeVersion(folder: string) { return util.versionLess(min1, min2) ? min2 : min1; } -export function configurePresets(folder: string) { - return presetsFiles.get(folder)?.configurePresets || []; +export function configurePresets(folder: string, usePresetsPlusIncluded: boolean = false) { + if (usePresetsPlusIncluded) { + return presetsPlusIncluded.get(folder)?.configurePresets || []; + } + return expandedPresets.get(folder)?.configurePresets || []; } -export function userConfigurePresets(folder: string) { - return userPresetsFiles.get(folder)?.configurePresets || []; +export function userConfigurePresets(folder: string, usePresetsPlusIncluded: boolean = false) { + if (usePresetsPlusIncluded) { + return userPresetsPlusIncluded.get(folder)?.configurePresets || []; + } + return expandedUserPresets.get(folder)?.configurePresets || []; } /** * Don't use this function if you need to keep any changes in the presets */ -export function allConfigurePresets(folder: string) { - return configurePresets(folder).concat(userConfigurePresets(folder)); +export function allConfigurePresets(folder: string, usePresetsPlusIncluded: boolean = false) { + return lodash.unionWith(configurePresets(folder, usePresetsPlusIncluded).concat(userConfigurePresets(folder, usePresetsPlusIncluded)), (a, b) => a.name === b.name); } -export function buildPresets(folder: string) { - return presetsFiles.get(folder)?.buildPresets || []; +export function buildPresets(folder: string, usePresetsPlusIncluded: boolean = false) { + if (usePresetsPlusIncluded) { + return presetsPlusIncluded.get(folder)?.buildPresets || []; + } + return expandedPresets.get(folder)?.buildPresets || []; } -export function userBuildPresets(folder: string) { - return userPresetsFiles.get(folder)?.buildPresets || []; +export function userBuildPresets(folder: string, usePresetsPlusIncluded: boolean = false) { + if (usePresetsPlusIncluded) { + return userPresetsPlusIncluded.get(folder)?.buildPresets || []; + } + return expandedUserPresets.get(folder)?.buildPresets || []; } /** * Don't use this function if you need to keep any changes in the presets */ -export function allBuildPresets(folder: string) { - return buildPresets(folder).concat(userBuildPresets(folder)); +export function allBuildPresets(folder: string, usePresetsPlusIncluded: boolean = false) { + return lodash.unionWith(buildPresets(folder, usePresetsPlusIncluded).concat(userBuildPresets(folder, usePresetsPlusIncluded)), (a, b) => a.name === b.name); } -export function testPresets(folder: string) { - return presetsFiles.get(folder)?.testPresets || []; +export function testPresets(folder: string, usePresetsPlusIncluded: boolean = false) { + if (usePresetsPlusIncluded) { + return presetsPlusIncluded.get(folder)?.testPresets || []; + } + return expandedPresets.get(folder)?.testPresets || []; } -export function userTestPresets(folder: string) { - return userPresetsFiles.get(folder)?.testPresets || []; +export function userTestPresets(folder: string, usePresetsPlusIncluded: boolean = false) { + if (usePresetsPlusIncluded) { + return userPresetsPlusIncluded.get(folder)?.testPresets || []; + } + return expandedUserPresets.get(folder)?.testPresets || []; } /** * Don't use this function if you need to keep any changes in the presets */ -export function allTestPresets(folder: string) { - return testPresets(folder).concat(userTestPresets(folder)); +export function allTestPresets(folder: string, usePresetsPlusIncluded: boolean = false) { + return lodash.unionWith(testPresets(folder, usePresetsPlusIncluded).concat(userTestPresets(folder, usePresetsPlusIncluded)), (a, b) => a.name === b.name); } -export function packagePresets(folder: string) { - return presetsFiles.get(folder)?.packagePresets || []; +export function packagePresets(folder: string, usePresetsPlusIncluded: boolean = false) { + if (usePresetsPlusIncluded) { + return presetsPlusIncluded.get(folder)?.packagePresets || []; + } + return expandedPresets.get(folder)?.packagePresets || []; } -export function userPackagePresets(folder: string) { - return userPresetsFiles.get(folder)?.packagePresets || []; +export function userPackagePresets(folder: string, usePresetsPlusIncluded: boolean = false) { + if (usePresetsPlusIncluded) { + return userPresetsPlusIncluded.get(folder)?.packagePresets || []; + } + return expandedUserPresets.get(folder)?.packagePresets || []; } /** * Don't use this function if you need to keep any changes in the presets */ -export function allPackagePresets(folder: string) { - return packagePresets(folder).concat(userPackagePresets(folder)); +export function allPackagePresets(folder: string, usePresetsPlusIncluded: boolean = false) { + return lodash.unionWith(packagePresets(folder, usePresetsPlusIncluded).concat(userPackagePresets(folder, usePresetsPlusIncluded)), (a, b) => a.name === b.name); } -export function workflowPresets(folder: string) { - return presetsFiles.get(folder)?.workflowPresets || []; +export function workflowPresets(folder: string, usePresetsPlusIncluded: boolean = false) { + if (usePresetsPlusIncluded) { + return presetsPlusIncluded.get(folder)?.workflowPresets || []; + } + return expandedPresets.get(folder)?.workflowPresets || []; } -export function userWorkflowPresets(folder: string) { - return userPresetsFiles.get(folder)?.workflowPresets || []; +export function userWorkflowPresets(folder: string, usePresetsPlusIncluded: boolean = false) { + if (usePresetsPlusIncluded) { + return userPresetsPlusIncluded.get(folder)?.workflowPresets || []; + } + return expandedUserPresets.get(folder)?.workflowPresets || []; } /** * Don't use this function if you need to keep any changes in the presets */ -export function allWorkflowPresets(folder: string) { - return workflowPresets(folder).concat(userWorkflowPresets(folder)); +export function allWorkflowPresets(folder: string, usePresetsPlusIncluded: boolean = false) { + return lodash.unionWith(workflowPresets(folder, usePresetsPlusIncluded).concat(userWorkflowPresets(folder, usePresetsPlusIncluded)), (a, b) => a.name === b.name); } export function getPresetByName(presets: T[], name: string): T | null { @@ -610,50 +703,33 @@ function merge(target: T, base: T) { */ const referencedConfigurePresets: Map> = new Map(); -/** - * This is actually a very limited version of expandConfigurePreset. - * Build/test presets currently don't need this, but We could extend this - * to work with build/test presets in the future. - * Use expandVendorPreset if other fields are needed. - * They should NOT be used together. - * They should Not call each other. - */ -export function expandVendorForConfigurePresets(folder: string): void { - for (const preset of configurePresets(folder)) { - getVendorForConfigurePreset(folder, preset.name); - } - for (const preset of userConfigurePresets(folder)) { - getVendorForConfigurePreset(folder, preset.name); - } -} - -function getVendorForConfigurePreset(folder: string, name: string): VendorType | VendorVsSettings | null { +async function getVendorForConfigurePreset(folder: string, name: string, sourceDir: string, workspaceFolder: string, allowUserPreset: boolean = false, usePresetsPlusIncluded: boolean = false, errorHandler?: ExpansionErrorHandler): Promise { const refs = referencedConfigurePresets.get(folder); if (!refs) { referencedConfigurePresets.set(folder, new Set()); } else { refs.clear(); } - return getVendorForConfigurePresetImpl(folder, name); + return getVendorForConfigurePresetImpl(folder, name, sourceDir, workspaceFolder, allowUserPreset, usePresetsPlusIncluded, errorHandler); } -function getVendorForConfigurePresetImpl(folder: string, name: string, allowUserPreset: boolean = false): VendorType | VendorVsSettings | null { - let preset = getPresetByName(configurePresets(folder), name); +async function getVendorForConfigurePresetImpl(folder: string, name: string, sourceDir: string, workspaceFolder: string, allowUserPreset: boolean = false, usePresetsPlusIncluded: boolean = false, errorHandler?: ExpansionErrorHandler): Promise { + let preset = getPresetByName(configurePresets(folder, usePresetsPlusIncluded), name); if (preset) { - return getVendorForConfigurePresetHelper(folder, preset); + return getVendorForConfigurePresetHelper(folder, preset, sourceDir, workspaceFolder, allowUserPreset, usePresetsPlusIncluded, errorHandler); } if (allowUserPreset) { - preset = getPresetByName(userConfigurePresets(folder), name); + preset = getPresetByName(userConfigurePresets(folder, usePresetsPlusIncluded), name); if (preset) { - return getVendorForConfigurePresetHelper(folder, preset, true); + return getVendorForConfigurePresetHelper(folder, preset, sourceDir, workspaceFolder, allowUserPreset, usePresetsPlusIncluded, errorHandler); } } return null; } -function getVendorForConfigurePresetHelper(folder: string, preset: ConfigurePreset, allowUserPreset: boolean = false): VendorType | VendorVsSettings | null { +async function getVendorForConfigurePresetHelper(folder: string, preset: ConfigurePreset, sourceDir: string, workspaceFolder: string, allowUserPreset: boolean = false, usePresetsPlusIncluded: boolean = false, errorHandler?: ExpansionErrorHandler): Promise { if (preset.__expanded) { return preset.vendor || null; } @@ -663,6 +739,7 @@ function getVendorForConfigurePresetHelper(folder: string, preset: ConfigurePres if (refs.has(preset.name)) { // Referenced this preset before, but it doesn't have a configure preset. This is a circular inheritance. log.error(localize('circular.inherits.in.config.preset', 'Circular inherits in configure preset {0}', preset.name)); + errorHandler?.errorList.push([localize('circular.inherits.in.config.preset', 'Circular inherits in configure preset'), preset.name]); return null; } @@ -675,7 +752,7 @@ function getVendorForConfigurePresetHelper(folder: string, preset: ConfigurePres preset.inherits = [preset.inherits]; } for (const parent of preset.inherits) { - const parentVendor = getVendorForConfigurePresetImpl(folder, parent, allowUserPreset); + const parentVendor = await getVendorForConfigurePresetImpl(folder, parent, sourceDir, workspaceFolder, usePresetsPlusIncluded, allowUserPreset); if (parentVendor) { for (const key in parentVendor) { if (preset.vendor[key] === undefined) { @@ -689,10 +766,10 @@ function getVendorForConfigurePresetHelper(folder: string, preset: ConfigurePres return preset.vendor || null; } -async function getExpansionOptions(workspaceFolder: string, sourceDir: string, preset: ConfigurePreset | BuildPreset | TestPreset) { - const generator = 'generator' in preset +async function getExpansionOptions(workspaceFolder: string, sourceDir: string, preset: ConfigurePreset | BuildPreset | TestPreset | PackagePreset, envOverride?: EnvironmentWithNull, penvOverride?: EnvironmentWithNull, includeGenerator: boolean = true) { + const generator = includeGenerator ? 'generator' in preset ? preset.generator - : ('__generator' in preset ? preset.__generator : undefined); + : ('__generator' in preset ? preset.__generator : undefined) : undefined; const expansionOpts: ExpansionOptions = { vars: { @@ -708,7 +785,8 @@ async function getExpansionOptions(workspaceFolder: string, sourceDir: string, p sourceDirName: path.basename(sourceDir), presetName: preset.name }, - envOverride: preset.environment, + envOverride: envOverride ?? preset.environment, + penvOverride: penvOverride, recursive: true, // Don't support commands since expansion might be called on activation. If there is // an extension depending on us, and there is a command in this extension is invoked, @@ -729,7 +807,7 @@ async function getExpansionOptions(workspaceFolder: string, sourceDir: string, p return expansionOpts; } -async function expandCondition(condition: boolean | Condition | null | undefined, expansionOpts: ExpansionOptions): Promise { +async function expandCondition(condition: boolean | Condition | null | undefined, expansionOpts: ExpansionOptions, errorHandler?: ExpansionErrorHandler): Promise { if (util.isNullOrUndefined(condition)) { return undefined; } @@ -739,18 +817,18 @@ async function expandCondition(condition: boolean | Condition | null | undefined if (condition.type) { const result: Condition = { type: condition.type }; if (condition.lhs) { - result.lhs = await expandString(condition.lhs, expansionOpts); + result.lhs = await expandString(condition.lhs, expansionOpts, errorHandler); } if (condition.rhs) { - result.rhs = await expandString(condition.rhs, expansionOpts); + result.rhs = await expandString(condition.rhs, expansionOpts, errorHandler); } if (condition.string) { - result.string = await expandString(condition.string, expansionOpts); + result.string = await expandString(condition.string, expansionOpts, errorHandler); } if (condition.list) { result.list = []; for (const value of condition.list) { - result.list.push(await expandString(value, expansionOpts)); + result.list.push(await expandString(value, expansionOpts, errorHandler)); } } if (condition.condition) { @@ -774,125 +852,15 @@ async function expandCondition(condition: boolean | Condition | null | undefined return undefined; } -export async function expandConditionsForPresets(folder: string, sourceDir: string) { - for (const preset of allConfigurePresets(folder)) { - if (preset.condition) { - const opts = await getExpansionOptions('${workspaceFolder}', sourceDir, preset); - preset.condition = await expandCondition(preset.condition, opts); - } - } - for (const preset of allBuildPresets(folder)) { - if (preset.condition) { - const opts = await getExpansionOptions('${workspaceFolder}', sourceDir, preset); - preset.condition = await expandCondition(preset.condition, opts); - } - } - for (const preset of allTestPresets(folder)) { - if (preset.condition) { - const opts = await getExpansionOptions('${workspaceFolder}', sourceDir, preset); - preset.condition = await expandCondition(preset.condition, opts); - } - } -} - -export async function expandConfigurePreset(folder: string, name: string, workspaceFolder: string, sourceDir: string, allowUserPreset: boolean = false): Promise { - const refs = referencedConfigurePresets.get(folder); - if (!refs) { - referencedConfigurePresets.set(folder, new Set()); - } else { - refs.clear(); - } - - let preset = await expandConfigurePresetImpl(folder, name, workspaceFolder, sourceDir, allowUserPreset); - if (!preset) { - return null; - } - preset = await tryApplyVsDevEnv(preset); - - preset.environment = EnvironmentUtils.mergePreserveNull([process.env, preset.environment]); - - // Expand strings under the context of current preset - const expandedPreset: ConfigurePreset = { name }; - const expansionOpts: ExpansionOptions = await getExpansionOptions(workspaceFolder, sourceDir, preset); - - // Expand environment vars first since other fields may refer to them - if (preset.environment) { - expandedPreset.environment = EnvironmentUtils.createPreserveNull(); - for (const key in preset.environment) { - if (preset.environment[key]) { - expandedPreset.environment[key] = await expandString(preset.environment[key]!, expansionOpts); - } - } - } - - expansionOpts.envOverride = expandedPreset.environment; - - if (preset.__file && preset.__file.version >= 3) { - // For presets v3+ binaryDir is optional, but cmake-tools needs a value. Default to something reasonable. - if (!preset.binaryDir) { - const defaultValue = '${sourceDir}/out/build/${presetName}'; - - log.debug(localize('binaryDir.undefined', 'Configure preset {0}: No binaryDir specified, using default value {1}', preset.name, `"${defaultValue}"`)); - preset.binaryDir = defaultValue; - } - } - - // Expand other fields - if (preset.binaryDir) { - expandedPreset.binaryDir = util.lightNormalizePath(await expandString(preset.binaryDir, expansionOpts)); - if (!path.isAbsolute(expandedPreset.binaryDir)) { - expandedPreset.binaryDir = util.resolvePath(expandedPreset.binaryDir, sourceDir); - } - } - - if (preset.cmakeExecutable) { - expandedPreset.cmakeExecutable = util.lightNormalizePath(await expandString(preset.cmakeExecutable, expansionOpts)); - } - - if (preset.installDir) { - expandedPreset.installDir = util.lightNormalizePath(await expandString(preset.installDir, expansionOpts)); - } - - if (preset.toolchainFile) { - expandedPreset.toolchainFile = util.lightNormalizePath(await expandString(preset.toolchainFile, expansionOpts)); - } - - if (preset.cacheVariables) { - expandedPreset.cacheVariables = {}; - for (const cacheVarName in preset.cacheVariables) { - const cacheVar = preset.cacheVariables[cacheVarName]; - if (typeof cacheVar === 'boolean') { - expandedPreset.cacheVariables[cacheVarName] = cacheVar; - } else if (cacheVar || cacheVar === "") { - if (util.isString(cacheVar)) { - expandedPreset.cacheVariables[cacheVarName] = await expandString(cacheVar, expansionOpts); - } else if (util.isString(cacheVar.value)) { - expandedPreset.cacheVariables[cacheVarName] = { type: cacheVar.type, value: await expandString(cacheVar.value, expansionOpts) }; - } else { - expandedPreset.cacheVariables[cacheVarName] = { type: cacheVar.type, value: cacheVar.value }; - } - } - } - } - - if (preset.condition) { - expandedPreset.condition = await expandCondition(expandedPreset.condition, expansionOpts); - } - - // Other fields can be copied by reference for simplicity - merge(expandedPreset, preset); - - return expandedPreset; -} - export function getArchitecture(preset: ConfigurePreset) { if (util.isString(preset.architecture)) { return preset.architecture; } else if (preset.architecture && preset.architecture.value) { return preset.architecture.value; } - log.warning(localize('no.cl.arch', 'Configure preset {0}: No architecture specified for cl.exe, using x86 by default', preset.name)); - return 'x86'; + const fallbackArchitecture = util.getHostArchitecture(); + log.warning(localize('no.cl.arch', 'Configure preset {0}: No architecture specified for cl.exe, using {1} by default', preset.name, fallbackArchitecture)); + return fallbackArchitecture; } export function getToolset(preset: ConfigurePreset): Toolset { @@ -903,21 +871,22 @@ export function getToolset(preset: ConfigurePreset): Toolset { result = parseToolset(preset.toolset.value); } - const noToolsetArchWarning = localize('no.cl.toolset.arch', "Configure preset {0}: No toolset architecture specified for cl.exe, using {1} by default", preset.name, '"host=x86"'); + const fallbackArchitecture = util.getHostArchitecture(); + const noToolsetArchWarning = localize('no.cl.toolset.arch', "Configure preset {0}: No toolset architecture specified for cl.exe, using {1} by default", preset.name, `"host=${fallbackArchitecture}"`); if (result) { if (result.name === 'x86' || result.name === 'x64') { log.warning(localize('invalid.cl.toolset.arch', "Configure preset {0}: Unexpected toolset architecture specified {1}, did you mean {2}?", preset.name, `"${result.name}"`, `"host=${result.name}"`)); } if (!result.host) { log.warning(noToolsetArchWarning); - result.host = 'x86'; + result.host = fallbackArchitecture; } if (!result.version && result.name !== latestToolsetName) { log.warning(localize('no.cl.toolset.version', 'Configure preset {0}: No toolset version specified for cl.exe, using latest by default', preset.name)); } } else { log.warning(noToolsetArchWarning); - result = { host: 'x86' }; + result = { host: fallbackArchitecture }; } return result; } @@ -971,29 +940,129 @@ function parseToolset(toolset: string): Toolset { return result; } -async function expandConfigurePresetImpl(folder: string, name: string, workspaceFolder: string, sourceDir: string, allowUserPreset: boolean = false): Promise { - let preset = getPresetByName(configurePresets(folder), name); - if (preset) { - return expandConfigurePresetHelper(folder, preset, workspaceFolder, sourceDir); +export interface VsDevEnvOptions { + preset: ConfigurePreset; + shouldInterrogateForNinja: boolean; + compilerName?: string; // Only will have a value when `useVsDeveloperEnvironmentMode` is "auto" +} + +/** + * @param opts Options to control the behavior of obtaining the VS developer environment. + * @returns Either the VS developer environment or undefined if it could not be obtained. + */ +async function getVsDevEnv(opts: VsDevEnvOptions): Promise { + const arch = getArchitecture(opts.preset); + const toolset = getToolset(opts.preset); + + // Get version info for all VS instances. + const vsInstalls = await vsInstallations(); + + // The VS installation to grab developer environment from. + let vsInstall: VSInstallation | undefined; + + // VS generators starting with Visual Studio 15 2017 support CMAKE_GENERATOR_INSTANCE. + // If supported, we should respect this value when defined. If not defined, we should + // set it to ensure CMake chooses the same VS instance as we use here. + // Note that if the user sets this in a toolchain file we won't know about it, + // which could cause configuration to fail. However the user can workaround this by launching + // vscode from the dev prompt of their desired instance. + // https://cmake.org/cmake/help/latest/variable/CMAKE_GENERATOR_INSTANCE.html + let vsGeneratorVersion: number | undefined; + const matches = opts.preset.generator?.match(/Visual Studio (?\d+)/); + if (opts.preset.cacheVariables && matches && matches.groups?.version) { + vsGeneratorVersion = parseInt(matches.groups.version); + const useCMakeGeneratorInstance = !isNaN(vsGeneratorVersion) && vsGeneratorVersion >= 15; + const cmakeGeneratorInstance = getStringValueFromCacheVar(opts.preset.cacheVariables['CMAKE_GENERATOR_INSTANCE']); + if (useCMakeGeneratorInstance && cmakeGeneratorInstance) { + const cmakeGeneratorInstanceNormalized = path.normalize(cmakeGeneratorInstance); + vsInstall = vsInstalls.find((vs) => vs.installationPath + && path.normalize(vs.installationPath) === cmakeGeneratorInstanceNormalized); + + if (!vsInstall) { + log.warning(localize('specified.vs.not.found', + "Configure preset {0}: Visual Studio instance specified by {1} was not found, falling back on default instance lookup behavior.", + opts.preset.name, `CMAKE_GENERATOR_INSTANCE="${cmakeGeneratorInstance}"`)); + } + } } - if (allowUserPreset) { - preset = getPresetByName(userConfigurePresets(folder), name); - if (preset) { - return expandConfigurePresetHelper(folder, preset, workspaceFolder, sourceDir, true); + // If VS instance wasn't chosen using CMAKE_GENERATOR_INSTANCE, look up a matching instance + // that supports the specified toolset. + if (!vsInstall) { + // sort VS installs in order of descending version. This ensures we choose the latest supported install first. + vsInstalls.sort((a, b) => { + if (a.isPrerelease && !b.isPrerelease) { + return 1; + } else if (!a.isPrerelease && b.isPrerelease) { + return -1; + } + return -compareVersions(a.installationVersion, b.installationVersion); + }); + + for (const vs of vsInstalls) { + // Check for existence of vcvars script to determine whether desired host/target architecture is supported. + // toolset.host will be set by getToolset. + if (await getVcVarsBatScript(vs, toolset.host!, arch)) { + // If a toolset version is specified then check to make sure this vs instance has it installed. + if (toolset.version) { + const availableToolsets = await enumerateMsvcToolsets(vs.installationPath, vs.installationVersion); + // forcing non-null due to false positive (toolset.version is checked in conditional) + if (availableToolsets?.find(t => t.startsWith(toolset.version!))) { + vsInstall = vs; + break; + } + } else if (!vsGeneratorVersion || vs.installationVersion.startsWith(vsGeneratorVersion.toString())) { + // If no toolset version specified then choose the latest VS instance for the given generator + vsInstall = vs; + break; + } + } } } - log.error(localize('config.preset.not.found', 'Could not find configure preset with name {0}', name)); - return null; + if (!vsInstall) { + if (opts.compilerName) { + log.error(localize('specified.cl.not.found', + "Configure preset {0}: Compiler {1} with toolset {2} and architecture {3} was not found, you may need to run the 'CMake: Scan for Compilers' command if this toolset exists on your computer.", + opts.preset.name, `"${opts.compilerName}.exe"`, toolset.version ? `"${toolset.version},${toolset.host}"` : `"${toolset.host}"`, `"${arch}"`)); + } else { + log.error(localize('vs.not.found', "Configure preset {0}: No Visual Studio installation found that supports the specified toolset {1} and architecture {2}, you may need to run the 'CMake: Scan for Compilers' command if this toolset exists on your computer.", + opts.preset.name, toolset.version ? `"${toolset.version},${toolset.host}"` : `"${toolset.host}"`, `"${arch}"`)); + } + } else { + log.info(localize('using.vs.instance', "Using developer environment from Visual Studio (instance {0}, version {1}, installed at {2})", vsInstall.instanceId, vsInstall.installationVersion, `"${vsInstall.installationPath}"`)); + const vsEnv = await varsForVSInstallation(vsInstall, toolset.host!, arch, toolset.version); + const compilerEnv = vsEnv ?? EnvironmentUtils.create(); + + if (opts.shouldInterrogateForNinja) { + const vsCMakePaths = await paths.vsCMakePaths(vsInstall.instanceId); + if (vsCMakePaths.ninja) { + log.warning(localize('ninja.not.set', 'Ninja is not set on PATH, trying to use {0}', vsCMakePaths.ninja)); + compilerEnv['PATH'] = `${path.dirname(vsCMakePaths.ninja)};${compilerEnv['PATH']}`; + } + } + + return compilerEnv; + } } -async function tryApplyVsDevEnv(preset: ConfigurePreset) { - if (!preset.__vsDevEnvApplied) { - let compilerEnv = EnvironmentUtils.createPreserveNull(); - // [Windows Only] If CMAKE_CXX_COMPILER or CMAKE_C_COMPILER is set as cl, clang, clang-cl, clang-cpp and clang++, - // but they are not on PATH, then set the env automatically. - if (process.platform === 'win32') { +/** + * This method tries to apply, based on the useVsDeveloperEnvironment setting value and, in "auto" mode, whether certain preset compilers/generators are used and not found, the VS Dev Env. + * @param preset Preset to modify the parentEnvironment of. If the developer environment should be applied, the preset.environment is modified by reference. + * @param workspaceFolder The workspace folder of the CMake project. + * @param sourceDir The source dir of the CMake project. + * @returns Void. We don't return as we are modifying the preset by reference. + */ +export async function tryApplyVsDevEnv(preset: ConfigurePreset, workspaceFolder: string, sourceDir: string): Promise { + const useVsDeveloperEnvironmentMode = vscode.workspace.getConfiguration("cmake", vscode.Uri.file(workspaceFolder)).get("useVsDeveloperEnvironment") as UseVsDeveloperEnvironment; + if (useVsDeveloperEnvironmentMode === "never") { + return; + } + + let developerEnvironment: EnvironmentWithNull | undefined; + // [Windows Only] We only support VS Dev Env on Windows. + if (!preset.__parentEnvironment && process.platform === "win32") { + if (useVsDeveloperEnvironmentMode === "auto") { if (preset.cacheVariables) { const cxxCompiler = getStringValueFromCacheVar(preset.cacheVariables['CMAKE_CXX_COMPILER'])?.toLowerCase(); const cCompiler = getStringValueFromCacheVar(preset.cacheVariables['CMAKE_C_COMPILER'])?.toLowerCase(); @@ -1020,122 +1089,105 @@ async function tryApplyVsDevEnv(preset: ConfigurePreset) { } if (compilerName && whereExecutable) { + // We need to construct and temporarily expand the environment in order to accurately determine if this preset has the compiler / ninja on PATH. + // This puts the preset.environment on top of process.env, then expands with process.env as the penv and preset.environment as the envOverride + const env = EnvironmentUtils.mergePreserveNull([process.env, preset.environment]); + const expansionOpts: ExpansionOptions = await getExpansionOptions(workspaceFolder, sourceDir, preset, env); + + const presetEnv = lodash.cloneDeep(preset.environment); + if (presetEnv) { + for (const key in presetEnv) { + if (presetEnv[key]) { + presetEnv[key] = await expandString(presetEnv[key]!, expansionOpts); + } + } + } + const compilerLocation = await execute(whereExecutable, [compilerName], null, { - environment: EnvironmentUtils.create(preset.environment), + environment: EnvironmentUtils.create(presetEnv), silent: true, encoding: 'utf8', shell: true }).result; - if (!compilerLocation.stdout) { - // Not on PATH, need to set env - const arch = getArchitecture(preset); - const toolset = getToolset(preset); - - // Get version info for all VS instances. - const vsInstalls = await vsInstallations(); - - // The VS installation to grab developer environment from. - let vsInstall: VSInstallation | undefined; - - // VS generators starting with Visual Studio 15 2017 support CMAKE_GENERATOR_INSTANCE. - // If supported, we should respect this value when defined. If not defined, we should - // set it to ensure CMake chooses the same VS instance as we use here. - // Note that if the user sets this in a toolchain file we won't know about it, - // which could cause configuration to fail. However the user can workaround this by launching - // vscode from the dev prompt of their desired instance. - // https://cmake.org/cmake/help/latest/variable/CMAKE_GENERATOR_INSTANCE.html - let vsGeneratorVersion: number | undefined; - const matches = preset.generator?.match(/Visual Studio (?\d+)/); - if (matches && matches.groups?.version) { - vsGeneratorVersion = parseInt(matches.groups.version); - const useCMakeGeneratorInstance = !isNaN(vsGeneratorVersion) && vsGeneratorVersion >= 15; - const cmakeGeneratorInstance = getStringValueFromCacheVar(preset.cacheVariables['CMAKE_GENERATOR_INSTANCE']); - if (useCMakeGeneratorInstance && cmakeGeneratorInstance) { - const cmakeGeneratorInstanceNormalized = path.normalize(cmakeGeneratorInstance); - vsInstall = vsInstalls.find((vs) => vs.installationPath - && path.normalize(vs.installationPath) === cmakeGeneratorInstanceNormalized); - - if (!vsInstall) { - log.warning(localize('specified.vs.not.found', - "Configure preset {0}: Visual Studio instance specified by {1} was not found, falling back on default instance lookup behavior.", - preset.name, `CMAKE_GENERATOR_INSTANCE="${cmakeGeneratorInstance}"`)); - } - } - } - - // If VS instance wasn't chosen using CMAKE_GENERATOR_INSTANCE, look up a matching instance - // that supports the specified toolset. - if (!vsInstall) { - // sort VS installs in order of descending version. This ensures we choose the latest supported install first. - vsInstalls.sort((a, b) => { - if (a.isPrerelease && !b.isPrerelease) { - return 1; - } else if (!a.isPrerelease && b.isPrerelease) { - return -1; - } - return -compareVersions(a.installationVersion, b.installationVersion); - }); - - for (const vs of vsInstalls) { - // Check for existence of vcvars script to determine whether desired host/target architecture is supported. - // toolset.host will be set by getToolset. - if (await getVcVarsBatScript(vs, toolset.host!, arch)) { - // If a toolset version is specified then check to make sure this vs instance has it installed. - if (toolset.version) { - const availableToolsets = await enumerateMsvcToolsets(vs.installationPath, vs.installationVersion); - // forcing non-null due to false positive (toolset.version is checked in conditional) - if (availableToolsets?.find(t => t.startsWith(toolset.version!))) { - vsInstall = vs; - break; - } - } else if (!vsGeneratorVersion || vs.installationVersion.startsWith(vsGeneratorVersion.toString())) { - // If no toolset version specified then choose the latest VS instance for the given generator - vsInstall = vs; - break; - } - } - } - } + // if ninja isn't on path, try to look for it in a VS install + const ninjaLoc = await execute(whereExecutable, ['ninja'], null, { + environment: EnvironmentUtils.create(presetEnv), + silent: true, + encoding: 'utf8', + shell: true + }).result; - if (!vsInstall) { - log.error(localize('specified.cl.not.found', - "Configure preset {0}: Compiler {1} with toolset {2} and architecture {3} was not found, you may need to run the 'CMake: Scan for Compilers' command if this toolset exists on your computer.", - preset.name, `"${compilerName}.exe"`, toolset.version ? `"${toolset.version},${toolset.host}"` : `"${toolset.host}"`, `"${arch}"`)); - } else { - log.info(localize('using.vs.instance', "Using developer environment from Visual Studio (instance {0}, version {1}, installed at {2})", vsInstall.instanceId, vsInstall.installationVersion, `"${vsInstall.installationPath}"`)); - const vsEnv = await varsForVSInstallation(vsInstall, toolset.host!, arch, toolset.version); - compilerEnv = vsEnv ?? EnvironmentUtils.create(); - - // if ninja isn't on path, try to look for it in a VS install - const ninjaLoc = await execute(whereExecutable, ['ninja'], null, { - environment: EnvironmentUtils.create(preset.environment), - silent: true, - encoding: 'utf8', - shell: true - }).result; - if (!ninjaLoc.stdout) { - const vsCMakePaths = await paths.vsCMakePaths(vsInstall.instanceId); - if (vsCMakePaths.ninja) { - log.warning(localize('ninja.not.set', 'Ninja is not set on PATH, trying to use {0}', vsCMakePaths.ninja)); - compilerEnv['PATH'] = `${path.dirname(vsCMakePaths.ninja)};${compilerEnv['PATH']}`; - } - } + const generatorIsNinja = preset.generator?.toLowerCase().includes("ninja"); + const shouldInterrogateForNinja = (generatorIsNinja ?? false) && !ninjaLoc.stdout; - preset.environment = EnvironmentUtils.mergePreserveNull([preset.environment, compilerEnv]); - } + if (!compilerLocation.stdout || shouldInterrogateForNinja) { + developerEnvironment = await getVsDevEnv({ + preset, + shouldInterrogateForNinja, + compilerName + }); } } } + } else if (useVsDeveloperEnvironmentMode === "always") { + developerEnvironment = await getVsDevEnv({ + preset, + shouldInterrogateForNinja: true + }); } + } + + if (developerEnvironment) { + preset.__developerEnvironmentArchitecture = getArchitecture(preset); + } - preset.__vsDevEnvApplied = true; + preset.__parentEnvironment = EnvironmentUtils.mergePreserveNull([process.env, preset.__parentEnvironment, developerEnvironment]); +} + +/** + * @param usePresetsPlusIncluded is used to determine whether to get the preset from the presets plus included map or the expanded presets map when + * calling configurePresets() or userConfigurePresets(). Getting the presets plus included map is useful on Select Preset when we want to be able to + * apply the Vs Dev Env to the preset and want the entire list of unexpanded presets, including the inlcuded presets. + */ +export async function getConfigurePresetInherits(folder: string, name: string, allowUserPreset: boolean = false, usePresetsPlusIncluded: boolean = false, errorHandler?: ExpansionErrorHandler): Promise { + // TODO: We likely need to refactor to include these refs, for configure, build, test, etc Presets. + const refs = referencedConfigurePresets.get(folder); + if (!refs) { + referencedConfigurePresets.set(folder, new Set()); + } else { + refs.clear(); } + const preset = await getConfigurePresetInheritsImpl(folder, name, allowUserPreset, usePresetsPlusIncluded, errorHandler); + errorHandlerHelper(name, errorHandler); + return preset; } -async function expandConfigurePresetHelper(folder: string, preset: ConfigurePreset, workspaceFolder: string, sourceDir: string, allowUserPreset: boolean = false) { +async function getConfigurePresetInheritsImpl(folder: string, name: string, allowUserPreset: boolean = false, usePresetsPlusIncluded: boolean = false, errorHandler?: ExpansionErrorHandler, inheritedByPreset?: ConfigurePreset): Promise { + let preset = getPresetByName(configurePresets(folder, usePresetsPlusIncluded), name); + if (preset) { + const presetList = inheritedByPreset ? inheritedByPreset.__file!.configurePresets : configurePresets(folder, usePresetsPlusIncluded); + const validInherit = presetList !== undefined && presetList.filter(p => p.name === name).length > 0; + if (validInherit) { + return getConfigurePresetInheritsHelper(folder, preset, false, usePresetsPlusIncluded, errorHandler); + } + } + + if (allowUserPreset) { + preset = getPresetByName(userConfigurePresets(folder, usePresetsPlusIncluded), name); + if (preset) { + return getConfigurePresetInheritsHelper(folder, preset, true, usePresetsPlusIncluded, errorHandler); + } + } + + log.error(localize('config.preset.not.found.full', 'Could not find configure preset with name {0}', name)); + errorHandler?.tempErrorList.push([localize('config.preset.not.found', 'Could not find configure preset'), name]); + return null; +} + +async function getConfigurePresetInheritsHelper(folder: string, preset: ConfigurePreset, allowUserPreset: boolean = false, usePresetsPlusIncluded: boolean = false, errorHandler?: ExpansionErrorHandler) { if (preset.__expanded) { return preset; } @@ -1145,10 +1197,12 @@ async function expandConfigurePresetHelper(folder: string, preset: ConfigurePres // toolchainFile and installDir added in presets v3 if (preset.toolchainFile) { log.error(localize('property.unsupported.v2', 'Configure preset {0}: Property {1} is unsupported in presets v2', preset.name, '"toolchainFile"')); + errorHandler?.errorList.push([localize('property.unsupported.v2', 'Property "toolchainFile" is unsupported in presets v2'), preset.name]); return null; } if (preset.installDir) { log.error(localize('property.unsupported.v2', 'Configure preset {0}: Property {1} is unsupported in presets v2', preset.name, '"installDir"')); + errorHandler?.errorList.push([localize('property.unsupported.v2', 'Configure preset {0}: Property "installDir" is unsupported in presets v2'), preset.name]); return null; } } @@ -1159,6 +1213,7 @@ async function expandConfigurePresetHelper(folder: string, preset: ConfigurePres if (refs.has(preset.name) && !preset.__expanded) { // Referenced this preset before, but it still hasn't been expanded. So this is a circular inheritance. log.error(localize('circular.inherits.in.config.preset', 'Circular inherits in configure preset {0}', preset.name)); + errorHandler?.errorList.push([localize('circular.inherits.in.config.preset', 'Circular inherits in configure preset'), preset.name]); return null; } @@ -1179,7 +1234,7 @@ async function expandConfigurePresetHelper(folder: string, preset: ConfigurePres preset.inherits = [preset.inherits]; } for (const parentName of preset.inherits) { - const parent = await expandConfigurePresetImpl(folder, parentName, workspaceFolder, sourceDir, allowUserPreset); + const parent = await getConfigurePresetInheritsImpl(folder, parentName, allowUserPreset, usePresetsPlusIncluded, errorHandler, preset); if (parent) { // Inherit environment inheritedEnv = EnvironmentUtils.mergePreserveNull([parent.environment, inheritedEnv]); @@ -1207,51 +1262,138 @@ async function expandConfigurePresetHelper(folder: string, preset: ConfigurePres return preset; } -// Used for both getConfigurePreset and expandBuildPreset. -// Map> -const referencedBuildPresets: Map> = new Map(); +export async function expandConfigurePresetVariables(preset: ConfigurePreset, folder: string, name: string, workspaceFolder: string, sourceDir: string, allowUserPreset: boolean = false, usePresetsPlusIncluded: boolean = false, errorHandler?: ExpansionErrorHandler): Promise { -/** - * This is actually a very limited version of expandBuildPreset/expandTestPreset. - * Use expandBuildPreset/expandTestPreset if other fields are needed. - * They should NOT be used together. - * They should Not call each other. - */ -export function expandConfigurePresetForPresets(folder: string, presetType: 'build' | 'test' | 'package' | 'workflow'): void { - if (presetType === 'build') { - for (const preset of buildPresets(folder)) { - getConfigurePresetForPreset(folder, preset.name, presetType); - } - for (const preset of userBuildPresets(folder)) { - getConfigurePresetForPreset(folder, preset.name, presetType, true); - } - } else if (presetType === 'test') { - for (const preset of testPresets(folder)) { - getConfigurePresetForPreset(folder, preset.name, presetType); - } - for (const preset of userTestPresets(folder)) { - getConfigurePresetForPreset(folder, preset.name, presetType, true); - } - } else if (presetType === 'package') { - for (const preset of packagePresets(folder)) { - getConfigurePresetForPreset(folder, preset.name, presetType); - } - for (const preset of userPackagePresets(folder)) { - getConfigurePresetForPreset(folder, preset.name, presetType, true); - } - } else if (presetType === 'workflow') { - for (const preset of workflowPresets(folder)) { - getConfigurePresetForPreset(folder, preset.name, presetType); - } - for (const preset of userWorkflowPresets(folder)) { - getConfigurePresetForPreset(folder, preset.name, presetType, true); + // Put the preset.environment on top of combined environment in the `__parentEnvironment` field. + // If for some reason the preset.__parentEnvironment is undefined, default to process.env. + // NOTE: Based on logic in `tryApplyVsDevEnv`, `preset.__parentEnvironment` should never be undefined at this point. + const env = EnvironmentUtils.mergePreserveNull([preset.__parentEnvironment ?? process.env, preset.environment]); + + // Expand strings under the context of current preset, also, pass preset.__parentEnvironment as a penvOverride so we include devenv if present. + // `preset.__parentEnvironment` is allowed to be undefined here because in expansion, it will default to process.env. + const expandedPreset: ConfigurePreset = { name }; + const expansionOpts: ExpansionOptions = await getExpansionOptions(workspaceFolder, sourceDir, preset, env, preset.__parentEnvironment); + + // Expand environment vars first since other fields may refer to them + if (preset.environment) { + expandedPreset.environment = EnvironmentUtils.createPreserveNull(); + for (const key in preset.environment) { + if (preset.environment[key]) { + expandedPreset.environment[key] = await expandString(preset.environment[key]!, expansionOpts, errorHandler); + } } } -} -function getConfigurePresetForPreset(folder: string, name: string, presetType: 'build' | 'test' | 'package' | 'workflow', allowUserPreset: boolean = false): string | null { - if (presetType === 'build') { - const refs = referencedBuildPresets.get(folder); + expansionOpts.envOverride = expandedPreset.environment; + + if (preset.__file && preset.__file.version >= 3) { + // For presets v3+ binaryDir is optional, but cmake-tools needs a value. Default to something reasonable. + if (!preset.binaryDir) { + const defaultValue = '${sourceDir}/out/build/${presetName}'; + + log.debug(localize('binaryDir.undefined', 'Configure preset {0}: No binaryDir specified, using default value {1}', preset.name, `"${defaultValue}"`)); + preset.binaryDir = defaultValue; + } + } + + // Expand other fields + if (preset.binaryDir) { + expandedPreset.binaryDir = util.lightNormalizePath(await expandString(preset.binaryDir, expansionOpts, errorHandler)); + if (!path.isAbsolute(expandedPreset.binaryDir)) { + expandedPreset.binaryDir = util.resolvePath(expandedPreset.binaryDir, sourceDir); + } + } + + if (preset.cmakeExecutable) { + expandedPreset.cmakeExecutable = util.lightNormalizePath(await expandString(preset.cmakeExecutable, expansionOpts, errorHandler)); + } + + if (preset.installDir) { + expandedPreset.installDir = util.resolvePath(await expandString(preset.installDir, expansionOpts), sourceDir); + } + + if (preset.toolchainFile) { + expandedPreset.toolchainFile = util.lightNormalizePath(await expandString(preset.toolchainFile, expansionOpts, errorHandler)); + } + + if (preset.cacheVariables) { + expandedPreset.cacheVariables = {}; + for (const cacheVarName in preset.cacheVariables) { + const cacheVar = preset.cacheVariables[cacheVarName]; + if (typeof cacheVar === 'boolean') { + expandedPreset.cacheVariables[cacheVarName] = cacheVar; + } else if (cacheVar || cacheVar === "") { + if (util.isString(cacheVar)) { + expandedPreset.cacheVariables[cacheVarName] = await expandString(cacheVar, expansionOpts, errorHandler); + } else if (util.isString(cacheVar.value)) { + expandedPreset.cacheVariables[cacheVarName] = { type: cacheVar.type, value: await expandString(cacheVar.value, expansionOpts, errorHandler) }; + } else { + expandedPreset.cacheVariables[cacheVarName] = { type: cacheVar.type, value: cacheVar.value }; + } + } + } + } + + if (preset.condition) { + expandedPreset.condition = await expandCondition(preset.condition, expansionOpts, errorHandler); + } + if (preset.vendor) { + await getVendorForConfigurePreset(folder, expandedPreset.name, sourceDir, workspaceFolder, allowUserPreset, usePresetsPlusIncluded, errorHandler); + } + + errorHandlerHelper(preset.name, errorHandler); + + // Other fields can be copied by reference for simplicity + merge(expandedPreset, preset); + + return expandedPreset; +} + +// Used for both getConfigurePreset and expandBuildPreset. +// Map> +const referencedBuildPresets: Map> = new Map(); + +/** + * This is actually a very limited version of expandBuildPreset/expandTestPreset. + * Use expandBuildPreset/expandTestPreset if other fields are needed. + * They should NOT be used together. + * They should Not call each other. + */ +export function expandConfigurePresetForPresets(folder: string, presetType: 'build' | 'test' | 'package' | 'workflow'): void { + if (presetType === 'build') { + for (const preset of buildPresets(folder)) { + getConfigurePresetForPreset(folder, preset.name, presetType); + } + for (const preset of userBuildPresets(folder)) { + getConfigurePresetForPreset(folder, preset.name, presetType, true); + } + } else if (presetType === 'test') { + for (const preset of testPresets(folder)) { + getConfigurePresetForPreset(folder, preset.name, presetType); + } + for (const preset of userTestPresets(folder)) { + getConfigurePresetForPreset(folder, preset.name, presetType, true); + } + } else if (presetType === 'package') { + for (const preset of packagePresets(folder)) { + getConfigurePresetForPreset(folder, preset.name, presetType); + } + for (const preset of userPackagePresets(folder)) { + getConfigurePresetForPreset(folder, preset.name, presetType, true); + } + } else if (presetType === 'workflow') { + for (const preset of workflowPresets(folder)) { + getConfigurePresetForPreset(folder, preset.name, presetType); + } + for (const preset of userWorkflowPresets(folder)) { + getConfigurePresetForPreset(folder, preset.name, presetType, true); + } + } +} + +function getConfigurePresetForPreset(folder: string, name: string, presetType: 'build' | 'test' | 'package' | 'workflow', allowUserPreset: boolean = false): string | null { + if (presetType === 'build') { + const refs = referencedBuildPresets.get(folder); if (!refs) { referencedBuildPresets.set(folder, new Set()); } else { @@ -1373,7 +1515,7 @@ function getConfigurePresetForPresetHelper(folder: string, preset: BuildPreset | return null; } -export async function expandBuildPreset(folder: string, name: string, workspaceFolder: string, sourceDir: string, parallelJobs?: number, preferredGeneratorName?: string, allowUserPreset: boolean = false, configurePreset?: string): Promise { +export async function getBuildPresetInherits(folder: string, name: string, workspaceFolder: string, sourceDir: string, parallelJobs?: number, preferredGeneratorName?: string, allowUserPreset: boolean = false, configurePreset?: string, usePresetsPlusIncluded: boolean = true, errorHandler?: ExpansionErrorHandler, inheritedByPreset?: BuildPreset): Promise { const refs = referencedBuildPresets.get(folder); if (!refs) { referencedBuildPresets.set(folder, new Set()); @@ -1381,61 +1523,26 @@ export async function expandBuildPreset(folder: string, name: string, workspaceF refs.clear(); } - const preset = await expandBuildPresetImpl(folder, name, workspaceFolder, sourceDir, parallelJobs, preferredGeneratorName, allowUserPreset, configurePreset); - if (!preset) { - return null; - } - - // Expand strings under the context of current preset - const expandedPreset: BuildPreset = { name }; - const expansionOpts: ExpansionOptions = await getExpansionOptions(workspaceFolder, sourceDir, preset); - - // Expand environment vars first since other fields may refer to them - if (preset.environment) { - expandedPreset.environment = EnvironmentUtils.createPreserveNull(); - for (const key in preset.environment) { - if (preset.environment[key]) { - expandedPreset.environment[key] = await expandString(preset.environment[key]!, expansionOpts); - } - } - } - - expansionOpts.envOverride = expandedPreset.environment; + const preset = await getBuildPresetInheritsImpl(folder, name, workspaceFolder, sourceDir, parallelJobs, preferredGeneratorName, allowUserPreset, configurePreset, usePresetsPlusIncluded, errorHandler, inheritedByPreset); + errorHandlerHelper(name, errorHandler); - // Expand other fields - if (preset.targets) { - if (util.isString(preset.targets)) { - expandedPreset.targets = await expandString(preset.targets, expansionOpts); - } else { - expandedPreset.targets = []; - for (let index = 0; index < preset.targets.length; index++) { - expandedPreset.targets[index] = await expandString(preset.targets[index], expansionOpts); - } - } - } - if (preset.nativeToolOptions) { - expandedPreset.nativeToolOptions = []; - for (let index = 0; index < preset.nativeToolOptions.length; index++) { - expandedPreset.nativeToolOptions[index] = await expandString(preset.nativeToolOptions[index], expansionOpts); - } - } - - // Other fields can be copied by reference for simplicity - merge(expandedPreset, preset); - - return expandedPreset; + return preset; } -async function expandBuildPresetImpl(folder: string, name: string, workspaceFolder: string, sourceDir: string, parallelJobs?: number, preferredGeneratorName?: string, allowUserPreset: boolean = false, configurePreset?: string): Promise { - let preset = getPresetByName(buildPresets(folder), name); +async function getBuildPresetInheritsImpl(folder: string, name: string, workspaceFolder: string, sourceDir: string, parallelJobs?: number, preferredGeneratorName?: string, allowUserPreset: boolean = false, configurePreset?: string, usePresetsPlusIncluded: boolean = true, errorHandler?: ExpansionErrorHandler, inheritedByPreset?: BuildPreset): Promise { + let preset = getPresetByName(buildPresets(folder, usePresetsPlusIncluded), name); if (preset) { - return expandBuildPresetHelper(folder, preset, workspaceFolder, sourceDir, parallelJobs, preferredGeneratorName); + const presetList = inheritedByPreset ? inheritedByPreset.__file!.buildPresets : buildPresets(folder, usePresetsPlusIncluded); + const validInherit = presetList !== undefined && presetList.filter(p => p.name === name).length > 0; + if (validInherit) { + return getBuildPresetInheritsHelper(folder, preset, workspaceFolder, sourceDir, parallelJobs, preferredGeneratorName, false, usePresetsPlusIncluded, errorHandler); + } } if (allowUserPreset) { - preset = getPresetByName(userBuildPresets(folder), name); + preset = getPresetByName(userBuildPresets(folder, usePresetsPlusIncluded), name); if (preset) { - return expandBuildPresetHelper(folder, preset, workspaceFolder, sourceDir, parallelJobs, preferredGeneratorName, true); + return getBuildPresetInheritsHelper(folder, preset, workspaceFolder, sourceDir, parallelJobs, preferredGeneratorName, true, usePresetsPlusIncluded, errorHandler); } } @@ -1448,14 +1555,15 @@ async function expandBuildPresetImpl(folder: string, name: string, workspaceFold jobs: parallelJobs || defaultNumJobs(), configurePreset }; - return expandBuildPresetHelper(folder, preset, workspaceFolder, sourceDir, parallelJobs, preferredGeneratorName, true); + return getBuildPresetInheritsHelper(folder, preset, workspaceFolder, sourceDir, parallelJobs, preferredGeneratorName, true, usePresetsPlusIncluded, errorHandler); } - log.error(localize('build.preset.not.found', 'Could not find build preset with name {0}', name)); + log.error(localize('build.preset.not.found.full', 'Could not find build preset with name {0}', name)); + errorHandler?.tempErrorList.push([localize('build.preset.not.found', 'Could not find build preset'), name]); return null; } -async function expandBuildPresetHelper(folder: string, preset: BuildPreset, workspaceFolder: string, sourceDir: string, parallelJobs?: number, preferredGeneratorName?: string, allowUserPreset: boolean = false) { +async function getBuildPresetInheritsHelper(folder: string, preset: BuildPreset, workspaceFolder: string, sourceDir: string, parallelJobs?: number, preferredGeneratorName?: string, allowUserPreset: boolean = false, usePresetsPlusIncluded: boolean = true, errorHandler?: ExpansionErrorHandler) { if (preset.__expanded) { return preset; } @@ -1467,6 +1575,7 @@ async function expandBuildPresetHelper(folder: string, preset: BuildPreset, work // Notice that we check !preset.__expanded here but not in getConfigurePresetForBuildPresetHelper because // multiple parents could all point to the same parent. log.error(localize('circular.inherits.in.build.preset', 'Circular inherits in build preset {0}', preset.name)); + errorHandler?.errorList.push([localize('circular.inherits.in.build.preset', 'Circular inherits in build preset'), preset.name]); return null; } @@ -1477,6 +1586,7 @@ async function expandBuildPresetHelper(folder: string, preset: BuildPreset, work preset.environment = EnvironmentUtils.createPreserveNull(); } let inheritedEnv = EnvironmentUtils.createPreserveNull(); + let inheritedParentEnv = EnvironmentUtils.createPreserveNull(); // Expand inherits if (preset.inherits) { @@ -1484,10 +1594,11 @@ async function expandBuildPresetHelper(folder: string, preset: BuildPreset, work preset.inherits = [preset.inherits]; } for (const parentName of preset.inherits) { - const parent = await expandBuildPresetImpl(folder, parentName, workspaceFolder, sourceDir, parallelJobs, preferredGeneratorName, allowUserPreset); + const parent = await getBuildPresetInheritsImpl(folder, parentName, workspaceFolder, sourceDir, parallelJobs, preferredGeneratorName, allowUserPreset, undefined, usePresetsPlusIncluded, errorHandler, preset); if (parent) { // Inherit environment inheritedEnv = EnvironmentUtils.mergePreserveNull([parent.environment, inheritedEnv]); + inheritedParentEnv = EnvironmentUtils.mergePreserveNull([parent.__parentEnvironment, inheritedParentEnv]); // Inherit other fields let key: keyof BuildPreset; for (key in parent) { @@ -1502,50 +1613,45 @@ async function expandBuildPresetHelper(folder: string, preset: BuildPreset, work // Expand configure preset. Evaluate this after inherits since it may come from parents if (preset.configurePreset) { - const configurePreset = await expandConfigurePreset(folder, preset.configurePreset, workspaceFolder, sourceDir, allowUserPreset); - if (configurePreset) { - preset.__binaryDir = configurePreset.binaryDir; - preset.__generator = configurePreset.generator; + const expandedConfigurePreset = getPresetByName(configurePresets(folder), preset.configurePreset); - if (preset.inheritConfigureEnvironment !== false) { // Check false explicitly since defaults to true - inheritedEnv = EnvironmentUtils.mergePreserveNull([inheritedEnv, configurePreset.environment]); - } - } else { + if (!expandedConfigurePreset) { + log.error(localize('configure.preset.not.found.full', 'Could not find configure preset with name {0}', preset.configurePreset)); + errorHandler?.tempErrorList.push([localize('configure.preset.not.found', 'Could not find configure preset'), preset.configurePreset]); return null; } + + preset.__binaryDir = expandedConfigurePreset.binaryDir; + preset.__generator = expandedConfigurePreset.generator; + + if (preset.inheritConfigureEnvironment !== false) { // Check false explicitly since defaults to true + inheritedEnv = EnvironmentUtils.mergePreserveNull([inheritedEnv, expandedConfigurePreset.environment]); + inheritedParentEnv = EnvironmentUtils.mergePreserveNull([inheritedParentEnv, expandedConfigurePreset.__parentEnvironment]); + } } - preset.environment = EnvironmentUtils.mergePreserveNull([process.env, inheritedEnv, preset.environment]); + // the preset.environment is applied after the configurePreset.environment + // same for parentenv and its getting ALL of processenv + preset.environment = EnvironmentUtils.mergePreserveNull([inheritedEnv, preset.environment]); + preset.__parentEnvironment = EnvironmentUtils.mergePreserveNull([inheritedParentEnv, preset.__parentEnvironment]); preset.__expanded = true; return preset; } -// Map> -const referencedTestPresets: Map> = new Map(); +export async function expandBuildPresetVariables(preset: BuildPreset, name: string, workspaceFolder: string, sourceDir: string, errorHandler?: ExpansionErrorHandler): Promise { + const env = EnvironmentUtils.mergePreserveNull([preset.__parentEnvironment ?? process.env, preset.environment]); -export async function expandTestPreset(folder: string, name: string, workspaceFolder: string, sourceDir: string, preferredGeneratorName?: string, allowUserPreset: boolean = false, configurePreset?: string): Promise { - const refs = referencedTestPresets.get(folder); - if (!refs) { - referencedTestPresets.set(folder, new Set()); - } else { - refs.clear(); - } - - const preset = await expandTestPresetImpl(folder, name, workspaceFolder, sourceDir, preferredGeneratorName, allowUserPreset, configurePreset); - if (!preset) { - return null; - } - - const expandedPreset: TestPreset = { name }; - const expansionOpts: ExpansionOptions = await getExpansionOptions(workspaceFolder, sourceDir, preset); + // Expand strings under the context of current preset + const expandedPreset: BuildPreset = { name }; + const expansionOpts: ExpansionOptions = await getExpansionOptions(workspaceFolder, sourceDir, preset, env, preset.__parentEnvironment); // Expand environment vars first since other fields may refer to them if (preset.environment) { expandedPreset.environment = EnvironmentUtils.createPreserveNull(); for (const key in preset.environment) { if (preset.environment[key]) { - expandedPreset.environment[key] = await expandString(preset.environment[key]!, expansionOpts); + expandedPreset.environment[key] = await expandString(preset.environment[key]!, expansionOpts, errorHandler); } } } @@ -1553,77 +1659,66 @@ export async function expandTestPreset(folder: string, name: string, workspaceFo expansionOpts.envOverride = expandedPreset.environment; // Expand other fields - if (preset.overwriteConfigurationFile) { - expandedPreset.overwriteConfigurationFile = []; - for (let index = 0; index < preset.overwriteConfigurationFile.length; index++) { - expandedPreset.overwriteConfigurationFile[index] = await expandString(preset.overwriteConfigurationFile[index], expansionOpts); - } - } - if (preset.output?.outputLogFile) { - expandedPreset.output = { outputLogFile: util.lightNormalizePath(await expandString(preset.output.outputLogFile, expansionOpts)) }; - merge(expandedPreset.output, preset.output); - } - if (preset.output?.outputJUnitFile) { - expandedPreset.output = { outputJUnitFile: util.lightNormalizePath(await expandString(preset.output.outputJUnitFile, expansionOpts)) }; - merge(expandedPreset.output, preset.output); - } - if (preset.filter) { - expandedPreset.filter = {}; - if (preset.filter.include) { - expandedPreset.filter.include = {}; - if (preset.filter.include.name) { - expandedPreset.filter.include.name = await expandString(preset.filter.include.name, expansionOpts); - } - if (util.isString(preset.filter.include.index)) { - expandedPreset.filter.include.index = await expandString(preset.filter.include.index, expansionOpts); + if (preset.targets) { + if (util.isString(preset.targets)) { + expandedPreset.targets = await expandString(preset.targets, expansionOpts, errorHandler); + } else { + expandedPreset.targets = []; + for (let index = 0; index < preset.targets.length; index++) { + expandedPreset.targets[index] = await expandString(preset.targets[index], expansionOpts, errorHandler); } - merge(expandedPreset.filter.include, preset.filter.include); } - if (preset.filter.exclude) { - expandedPreset.filter.exclude = {}; - if (preset.filter.exclude.label) { - expandedPreset.filter.exclude.label = await expandString(preset.filter.exclude.label, expansionOpts); - } - if (preset.filter.exclude.name) { - expandedPreset.filter.exclude.name = await expandString(preset.filter.exclude.name, expansionOpts); - } - if (preset.filter.exclude.fixtures) { - expandedPreset.filter.exclude.fixtures = {}; - if (preset.filter.exclude.fixtures.any) { - expandedPreset.filter.exclude.fixtures.any = await expandString(preset.filter.exclude.fixtures.any, expansionOpts); - } - if (preset.filter.exclude.fixtures.setup) { - expandedPreset.filter.exclude.fixtures.setup = await expandString(preset.filter.exclude.fixtures.setup, expansionOpts); - } - if (preset.filter.exclude.fixtures.cleanup) { - expandedPreset.filter.exclude.fixtures.cleanup = await expandString(preset.filter.exclude.fixtures.cleanup, expansionOpts); - } - merge(expandedPreset.filter.exclude.fixtures, preset.filter.exclude.fixtures); - } - merge(expandedPreset.filter.exclude, preset.filter.exclude); + } + if (preset.nativeToolOptions) { + expandedPreset.nativeToolOptions = []; + for (let index = 0; index < preset.nativeToolOptions.length; index++) { + expandedPreset.nativeToolOptions[index] = await expandString(preset.nativeToolOptions[index], expansionOpts, errorHandler); } - merge(expandedPreset.filter, preset.filter); } - if (preset.execution?.resourceSpecFile) { - expandedPreset.execution = { resourceSpecFile: util.lightNormalizePath(await expandString(preset.execution.resourceSpecFile, expansionOpts)) }; - merge(expandedPreset.execution, preset.execution); + + if (preset.condition) { + expandedPreset.condition = await expandCondition(preset.condition, expansionOpts, errorHandler); } + errorHandlerHelper(preset.name, errorHandler); + + // Other fields can be copied by reference for simplicity merge(expandedPreset, preset); - return expandedPreset; + return preset; } -async function expandTestPresetImpl(folder: string, name: string, workspaceFolder: string, sourceDir: string, preferredGeneratorName?: string, allowUserPreset: boolean = false, configurePreset?: string): Promise { - let preset = getPresetByName(testPresets(folder), name); +// Map> +const referencedTestPresets: Map> = new Map(); + +export async function getTestPresetInherits(folder: string, name: string, workspaceFolder: string, sourceDir: string, preferredGeneratorName?: string, allowUserPreset: boolean = false, configurePreset?: string, usePresetsPlusIncluded: boolean = true, errorHandler?: ExpansionErrorHandler, inheritedByPreset?: TestPreset): Promise { + const refs = referencedTestPresets.get(folder); + if (!refs) { + referencedTestPresets.set(folder, new Set()); + } else { + refs.clear(); + } + + const preset = await getTestPresetInheritsImpl(folder, name, workspaceFolder, sourceDir, preferredGeneratorName, allowUserPreset, configurePreset, usePresetsPlusIncluded, errorHandler, inheritedByPreset); + errorHandlerHelper(name, errorHandler); + + return preset; +} + +async function getTestPresetInheritsImpl(folder: string, name: string, workspaceFolder: string, sourceDir: string, preferredGeneratorName?: string, allowUserPreset: boolean = false, configurePreset?: string, usePresetsPlusIncluded: boolean = true, errorHandler?: ExpansionErrorHandler, inheritedByPreset?: TestPreset): Promise { + let preset = getPresetByName(testPresets(folder, usePresetsPlusIncluded), name); if (preset) { - return expandTestPresetHelper(folder, preset, workspaceFolder, sourceDir, preferredGeneratorName); + const presetList = inheritedByPreset ? inheritedByPreset.__file!.testPresets : testPresets(folder, usePresetsPlusIncluded); + const validInherit = presetList !== undefined && presetList.filter(p => p.name === name).length > 0; + if (validInherit) { + return getTestPresetInheritsHelper(folder, preset, workspaceFolder, sourceDir, preferredGeneratorName, false, usePresetsPlusIncluded, errorHandler); + } } if (allowUserPreset) { - preset = getPresetByName(userTestPresets(folder), name); + preset = getPresetByName(userTestPresets(folder, usePresetsPlusIncluded), name); if (preset) { - return expandTestPresetHelper(folder, preset, workspaceFolder, sourceDir, preferredGeneratorName, true); + return getTestPresetInheritsHelper(folder, preset, workspaceFolder, sourceDir, preferredGeneratorName, true, usePresetsPlusIncluded, errorHandler); } } @@ -1635,14 +1730,15 @@ async function expandTestPresetImpl(folder: string, name: string, workspaceFolde description: defaultTestPreset.description, configurePreset }; - return expandTestPresetHelper(folder, preset, workspaceFolder, sourceDir, preferredGeneratorName, true); + return getTestPresetInheritsHelper(folder, preset, workspaceFolder, sourceDir, preferredGeneratorName, true, usePresetsPlusIncluded, errorHandler); } - log.error(localize('test.preset.not.found', 'Could not find test preset with name {0}', name)); + log.error(localize('test.preset.not.found.full', 'Could not find test preset with name {0}', name)); + errorHandler?.tempErrorList.push([localize('test.preset.not.found', 'Could not find test preset'), name]); return null; } -async function expandTestPresetHelper(folder: string, preset: TestPreset, workspaceFolder: string, sourceDir: string, preferredGeneratorName: string | undefined, allowUserPreset: boolean = false) { +async function getTestPresetInheritsHelper(folder: string, preset: TestPreset, workspaceFolder: string, sourceDir: string, preferredGeneratorName: string | undefined, allowUserPreset: boolean = false, usePresetsPlusIncluded: boolean = true, errorHandler?: ExpansionErrorHandler) { if (preset.__expanded) { return preset; } @@ -1652,6 +1748,7 @@ async function expandTestPresetHelper(folder: string, preset: TestPreset, worksp if (refs.has(preset.name) && !preset.__expanded) { // Referenced this preset before, but it still hasn't been expanded. So this is a circular inheritance. log.error(localize('circular.inherits.in.test.preset', 'Circular inherits in test preset {0}', preset.name)); + errorHandler?.errorList.push([localize('circular.inherits.in.test.preset', 'Circular inherits in test preset'), preset.name]); return null; } @@ -1662,6 +1759,7 @@ async function expandTestPresetHelper(folder: string, preset: TestPreset, worksp preset.environment = EnvironmentUtils.createPreserveNull(); } let inheritedEnv = EnvironmentUtils.createPreserveNull(); + let inheritedParentEnv = EnvironmentUtils.createPreserveNull(); // Expand inherits if (preset.inherits) { @@ -1669,10 +1767,11 @@ async function expandTestPresetHelper(folder: string, preset: TestPreset, worksp preset.inherits = [preset.inherits]; } for (const parentName of preset.inherits) { - const parent = await expandTestPresetImpl(folder, parentName, workspaceFolder, sourceDir, preferredGeneratorName, allowUserPreset); + const parent = await getTestPresetInheritsImpl(folder, parentName, workspaceFolder, sourceDir, preferredGeneratorName, allowUserPreset, undefined, usePresetsPlusIncluded, errorHandler, preset); if (parent) { // Inherit environment inheritedEnv = EnvironmentUtils.mergePreserveNull([parent.environment, inheritedEnv]); + inheritedParentEnv = EnvironmentUtils.mergePreserveNull([parent.__parentEnvironment, inheritedParentEnv]); // Inherit other fields let key: keyof TestPreset; for (key in parent) { @@ -1687,71 +1786,149 @@ async function expandTestPresetHelper(folder: string, preset: TestPreset, worksp // Expand configure preset. Evaluate this after inherits since it may come from parents if (preset.configurePreset) { - const configurePreset = await expandConfigurePreset(folder, preset.configurePreset, workspaceFolder, sourceDir, allowUserPreset); - if (configurePreset) { - preset.__binaryDir = configurePreset.binaryDir; - preset.__generator = configurePreset.generator; - - if (preset.inheritConfigureEnvironment !== false) { // Check false explicitly since defaults to true - inheritedEnv = EnvironmentUtils.mergePreserveNull([inheritedEnv, configurePreset.environment]); - } - } else { + const expandedConfigurePreset = getPresetByName(configurePresets(folder), preset.configurePreset); + if (!expandedConfigurePreset) { + log.error(localize('configure.preset.not.found.full', 'Could not find configure preset with name {0}', preset.configurePreset)); + errorHandler?.tempErrorList.push([localize('configure.preset.not.found', 'Could not find configure preset'), preset.configurePreset]); return null; } + + preset.__binaryDir = expandedConfigurePreset.binaryDir; + preset.__generator = expandedConfigurePreset.generator; + + if (preset.inheritConfigureEnvironment !== false) { // Check false explicitly since defaults to true + inheritedEnv = EnvironmentUtils.mergePreserveNull([inheritedEnv, expandedConfigurePreset.environment]); + inheritedParentEnv = EnvironmentUtils.mergePreserveNull([inheritedParentEnv, expandedConfigurePreset.__parentEnvironment]); + } } - preset.environment = EnvironmentUtils.mergePreserveNull([process.env, inheritedEnv, preset.environment]); + // the preset.environment is applied after the configurePreset.environment + // same for parentenv and its getting ALL of processenv + preset.environment = EnvironmentUtils.mergePreserveNull([inheritedEnv, preset.environment]); + preset.__parentEnvironment = EnvironmentUtils.mergePreserveNull([inheritedParentEnv, preset.__parentEnvironment]); preset.__expanded = true; return preset; } -// Map> -const referencedPackagePresets: Map> = new Map(); +export async function expandTestPresetVariables(preset: TestPreset, name: string, workspaceFolder: string, sourceDir: string, errorHandler?: ExpansionErrorHandler): Promise { + const env = EnvironmentUtils.mergePreserveNull([preset.__parentEnvironment ?? process.env, preset.environment]); -export async function expandPackagePreset(folder: string, name: string, workspaceFolder: string, sourceDir: string, preferredGeneratorName?: string, allowUserPreset: boolean = false, configurePreset?: string): Promise { - const refs = referencedPackagePresets.get(folder); - if (!refs) { - referencedPackagePresets.set(folder, new Set()); - } else { - refs.clear(); - } - - const preset = await expandPackagePresetImpl(folder, name, workspaceFolder, sourceDir, preferredGeneratorName, allowUserPreset, configurePreset); - if (!preset) { - return null; - } - - const expandedPreset: PackagePreset = { name }; - const expansionOpts: ExpansionOptions = await getExpansionOptions(workspaceFolder, sourceDir, preset); + const expandedPreset: TestPreset = { name }; + const expansionOpts: ExpansionOptions = await getExpansionOptions(workspaceFolder, sourceDir, preset, env, preset.__parentEnvironment); // Expand environment vars first since other fields may refer to them if (preset.environment) { expandedPreset.environment = EnvironmentUtils.createPreserveNull(); for (const key in preset.environment) { if (preset.environment[key]) { - expandedPreset.environment[key] = await expandString(preset.environment[key]!, expansionOpts); + expandedPreset.environment[key] = await expandString(preset.environment[key]!, expansionOpts, errorHandler); } } } expansionOpts.envOverride = expandedPreset.environment; - // According to CMake docs, no other fields support macro expansion in a package preset. + // Expand other fields + if (preset.overwriteConfigurationFile) { + expandedPreset.overwriteConfigurationFile = []; + for (let index = 0; index < preset.overwriteConfigurationFile.length; index++) { + expandedPreset.overwriteConfigurationFile[index] = await expandString(preset.overwriteConfigurationFile[index], expansionOpts, errorHandler); + } + } + if (preset.output?.outputLogFile) { + expandedPreset.output = { outputLogFile: util.lightNormalizePath(await expandString(preset.output.outputLogFile, expansionOpts, errorHandler)) }; + merge(expandedPreset.output, preset.output); + } + if (preset.output?.outputJUnitFile) { + expandedPreset.output = { outputJUnitFile: util.lightNormalizePath(await expandString(preset.output.outputJUnitFile, expansionOpts, errorHandler)) }; + merge(expandedPreset.output, preset.output); + } + if (preset.filter) { + expandedPreset.filter = {}; + if (preset.filter.include) { + expandedPreset.filter.include = {}; + if (preset.filter.include.name) { + expandedPreset.filter.include.name = await expandString(preset.filter.include.name, expansionOpts, errorHandler); + } + if (util.isString(preset.filter.include.index)) { + expandedPreset.filter.include.index = await expandString(preset.filter.include.index, expansionOpts, errorHandler); + } + merge(expandedPreset.filter.include, preset.filter.include); + } + if (preset.filter.exclude) { + expandedPreset.filter.exclude = {}; + if (preset.filter.exclude.label) { + expandedPreset.filter.exclude.label = await expandString(preset.filter.exclude.label, expansionOpts, errorHandler); + } + if (preset.filter.exclude.name) { + expandedPreset.filter.exclude.name = await expandString(preset.filter.exclude.name, expansionOpts, errorHandler); + } + if (preset.filter.exclude.fixtures) { + expandedPreset.filter.exclude.fixtures = {}; + if (preset.filter.exclude.fixtures.any) { + expandedPreset.filter.exclude.fixtures.any = await expandString(preset.filter.exclude.fixtures.any, expansionOpts, errorHandler); + } + if (preset.filter.exclude.fixtures.setup) { + expandedPreset.filter.exclude.fixtures.setup = await expandString(preset.filter.exclude.fixtures.setup, expansionOpts, errorHandler); + } + if (preset.filter.exclude.fixtures.cleanup) { + expandedPreset.filter.exclude.fixtures.cleanup = await expandString(preset.filter.exclude.fixtures.cleanup, expansionOpts, errorHandler); + } + merge(expandedPreset.filter.exclude.fixtures, preset.filter.exclude.fixtures); + } + merge(expandedPreset.filter.exclude, preset.filter.exclude); + } + merge(expandedPreset.filter, preset.filter); + } + if (preset.execution?.resourceSpecFile) { + expandedPreset.execution = { resourceSpecFile: util.lightNormalizePath(await expandString(preset.execution.resourceSpecFile, expansionOpts, errorHandler)) }; + merge(expandedPreset.execution, preset.execution); + } + + if (preset.condition) { + expandedPreset.condition = await expandCondition(preset.condition, expansionOpts, errorHandler); + } + + errorHandlerHelper(preset.name, errorHandler); + + // Other fields can be copied by reference for simplicity merge(expandedPreset, preset); + return expandedPreset; } -async function expandPackagePresetImpl(folder: string, name: string, workspaceFolder: string, sourceDir: string, preferredGeneratorName?: string, allowUserPreset: boolean = false, configurePreset?: string): Promise { - let preset = getPresetByName(packagePresets(folder), name); +// Map> +const referencedPackagePresets: Map> = new Map(); + +export async function getPackagePresetInherits(folder: string, name: string, workspaceFolder: string, sourceDir: string, preferredGeneratorName?: string, allowUserPreset: boolean = false, configurePreset?: string, usePresetsPlusIncluded: boolean = true, errorHandler?: ExpansionErrorHandler, inheritedByPreset?: PackagePreset): Promise { + const refs = referencedPackagePresets.get(folder); + if (!refs) { + referencedPackagePresets.set(folder, new Set()); + } else { + refs.clear(); + } + + const preset = await getPackagePresetInheritsImpl(folder, name, workspaceFolder, sourceDir, preferredGeneratorName, allowUserPreset, configurePreset, usePresetsPlusIncluded, errorHandler, inheritedByPreset); + errorHandlerHelper(name, errorHandler); + + return preset; +} + +async function getPackagePresetInheritsImpl(folder: string, name: string, workspaceFolder: string, sourceDir: string, preferredGeneratorName?: string, allowUserPreset: boolean = false, configurePreset?: string, usePresetsPlusIncluded: boolean = true, errorHandler?: ExpansionErrorHandler, inheritedByPreset?: PackagePreset): Promise { + let preset = getPresetByName(packagePresets(folder, usePresetsPlusIncluded), name); if (preset) { - return expandPackagePresetHelper(folder, preset, workspaceFolder, sourceDir, preferredGeneratorName); + const presetList = inheritedByPreset ? inheritedByPreset.__file!.packagePresets : packagePresets(folder, usePresetsPlusIncluded); + const validInherit = presetList !== undefined && presetList.filter(p => p.name === name).length > 0; + if (validInherit) { + return getPackagePresetInheritsHelper(folder, preset, workspaceFolder, sourceDir, preferredGeneratorName, false, usePresetsPlusIncluded, errorHandler); + } } if (allowUserPreset) { - preset = getPresetByName(userPackagePresets(folder), name); + preset = getPresetByName(userPackagePresets(folder, usePresetsPlusIncluded), name); if (preset) { - return expandPackagePresetHelper(folder, preset, workspaceFolder, sourceDir, preferredGeneratorName, true); + return getPackagePresetInheritsHelper(folder, preset, workspaceFolder, sourceDir, preferredGeneratorName, true, usePresetsPlusIncluded, errorHandler); } } @@ -1763,14 +1940,15 @@ async function expandPackagePresetImpl(folder: string, name: string, workspaceFo description: defaultPackagePreset.description, configurePreset }; - return expandPackagePresetHelper(folder, preset, workspaceFolder, sourceDir, preferredGeneratorName, true); + return getPackagePresetInheritsHelper(folder, preset, workspaceFolder, sourceDir, preferredGeneratorName, true, usePresetsPlusIncluded, errorHandler); } - log.error(localize('package.preset.not.found', 'Could not find package preset with name {0}', name)); + log.error(localize('package.preset.not.found.full', 'Could not find package preset with name {0}', name)); + errorHandler?.errorList.push([localize('package.preset.not.found', 'Could not find package preset'), name]); return null; } -async function expandPackagePresetHelper(folder: string, preset: PackagePreset, workspaceFolder: string, sourceDir: string, preferredGeneratorName: string | undefined, allowUserPreset: boolean = false) { +async function getPackagePresetInheritsHelper(folder: string, preset: PackagePreset, workspaceFolder: string, sourceDir: string, preferredGeneratorName: string | undefined, allowUserPreset: boolean = false, usePresetsPlusIncluded: boolean = true, errorHandler?: ExpansionErrorHandler) { if (preset.__expanded) { return preset; } @@ -1780,6 +1958,7 @@ async function expandPackagePresetHelper(folder: string, preset: PackagePreset, if (refs.has(preset.name) && !preset.__expanded) { // Referenced this preset before, but it still hasn't been expanded. So this is a circular inheritance. log.error(localize('circular.inherits.in.package.preset', 'Circular inherits in package preset {0}', preset.name)); + errorHandler?.errorList.push([localize('circular.inherits.in.package.preset', 'Circular inherits in package preset'), preset.name]); return null; } @@ -1790,6 +1969,7 @@ async function expandPackagePresetHelper(folder: string, preset: PackagePreset, preset.environment = EnvironmentUtils.createPreserveNull(); } let inheritedEnv = EnvironmentUtils.createPreserveNull(); + let inheritedParentEnv = EnvironmentUtils.createPreserveNull(); // Expand inherits if (preset.inherits) { @@ -1797,10 +1977,11 @@ async function expandPackagePresetHelper(folder: string, preset: PackagePreset, preset.inherits = [preset.inherits]; } for (const parentName of preset.inherits) { - const parent = await expandPackagePresetImpl(folder, parentName, workspaceFolder, sourceDir, preferredGeneratorName, allowUserPreset); + const parent = await getPackagePresetInheritsImpl(folder, parentName, workspaceFolder, sourceDir, preferredGeneratorName, allowUserPreset, undefined, usePresetsPlusIncluded, errorHandler, preset); if (parent) { // Inherit environment inheritedEnv = EnvironmentUtils.mergePreserveNull([parent.environment, inheritedEnv]); + inheritedParentEnv = EnvironmentUtils.mergePreserveNull([parent.__parentEnvironment, inheritedParentEnv]); // Inherit other fields let key: keyof PackagePreset; for (key in parent) { @@ -1815,29 +1996,63 @@ async function expandPackagePresetHelper(folder: string, preset: PackagePreset, // Expand configure preset. Evaluate this after inherits since it may come from parents if (preset.configurePreset) { - const configurePreset = await expandConfigurePreset(folder, preset.configurePreset, workspaceFolder, sourceDir, allowUserPreset); - if (configurePreset) { - preset.__binaryDir = configurePreset.binaryDir; - preset.__generator = configurePreset.generator; - - if (preset.inheritConfigureEnvironment !== false) { // Check false explicitly since defaults to true - inheritedEnv = EnvironmentUtils.mergePreserveNull([inheritedEnv, configurePreset.environment]); - } - } else { + const expandedConfigurePreset = getPresetByName(configurePresets(folder), preset.configurePreset); + if (!expandedConfigurePreset) { + log.error(localize('configure.preset.not.found.full', 'Could not find configure preset with name {0}', preset.configurePreset)); + errorHandler?.tempErrorList.push([localize('configure.preset.not.found', 'Could not find configure preset'), preset.configurePreset]); return null; } + + preset.__binaryDir = expandedConfigurePreset.binaryDir; + preset.__generator = expandedConfigurePreset.generator; + + if (preset.inheritConfigureEnvironment !== false) { // Check false explicitly since defaults to true + inheritedEnv = EnvironmentUtils.mergePreserveNull([inheritedEnv, expandedConfigurePreset.environment]); + inheritedParentEnv = EnvironmentUtils.mergePreserveNull([inheritedParentEnv, expandedConfigurePreset.__parentEnvironment]); + } } - preset.environment = EnvironmentUtils.mergePreserveNull([process.env, inheritedEnv, preset.environment]); + // the preset.environment is applied after the configurePreset.environment + // same for parentenv and its getting ALL of processenv + preset.environment = EnvironmentUtils.mergePreserveNull([inheritedEnv, preset.environment]); + preset.__parentEnvironment = EnvironmentUtils.mergePreserveNull([inheritedParentEnv, preset.__parentEnvironment]); preset.__expanded = true; return preset; } +export async function expandPackagePresetVariables(preset: PackagePreset, name: string, workspaceFolder: string, sourceDir: string, errorHandler?: ExpansionErrorHandler): Promise { + const env = EnvironmentUtils.mergePreserveNull([preset.__parentEnvironment ?? process.env, preset.environment]); + + const expandedPreset: PackagePreset = { name }; + // Package presets cannot expand the macro ${generator} so this can't be included in opts + const expansionOpts: ExpansionOptions = await getExpansionOptions(workspaceFolder, sourceDir, preset, env, preset.__parentEnvironment, false); + + // Expand environment vars first since other fields may refer to them + if (preset.environment) { + expandedPreset.environment = EnvironmentUtils.createPreserveNull(); + for (const key in preset.environment) { + if (preset.environment[key]) { + expandedPreset.environment[key] = await expandString(preset.environment[key]!, expansionOpts, errorHandler); + } + } + } + + if (preset.condition) { + expandedPreset.condition = await expandCondition(preset.condition, expansionOpts, errorHandler); + } + + errorHandlerHelper(preset.name, errorHandler); + // According to CMake docs, no other fields support macro expansion in a package preset. + merge(expandedPreset, preset); + + return expandedPreset; +} + // Map> const referencedWorkflowPresets: Map> = new Map(); -export async function expandWorkflowPreset(folder: string, name: string, workspaceFolder: string, sourceDir: string, allowUserPreset: boolean = false, configurePreset?: string): Promise { +export async function getWorkflowPresetInherits(folder: string, name: string, workspaceFolder: string, sourceDir: string, allowUserPreset: boolean = false, configurePreset?: string, usePresetsPlusIncluded: boolean = true, errorHandler?: ExpansionErrorHandler): Promise { const refs = referencedWorkflowPresets.get(folder); if (!refs) { referencedWorkflowPresets.set(folder, new Set()); @@ -1845,29 +2060,35 @@ export async function expandWorkflowPreset(folder: string, name: string, workspa refs.clear(); } - const preset = await expandWorkflowPresetImpl(folder, name, workspaceFolder, sourceDir, allowUserPreset, configurePreset); + const preset = await getWorkflowPresetInheritsImpl(folder, name, workspaceFolder, sourceDir, allowUserPreset, configurePreset, usePresetsPlusIncluded, errorHandler); if (!preset) { return null; } const expandedPreset: WorkflowPreset = { name, steps: [{type: "configure", name: "_placeholder_"}] }; + errorHandlerHelper(preset.name, errorHandler); + // According to CMake docs, no other fields support macro expansion in a workflow preset. merge(expandedPreset, preset); expandedPreset.steps = preset.steps; return expandedPreset; } -async function expandWorkflowPresetImpl(folder: string, name: string, workspaceFolder: string, sourceDir: string, allowUserPreset: boolean = false, configurePreset?: string): Promise { - let preset = getPresetByName(workflowPresets(folder), name); +async function getWorkflowPresetInheritsImpl(folder: string, name: string, workspaceFolder: string, sourceDir: string, allowUserPreset: boolean = false, configurePreset?: string, usePresetsPlusIncluded: boolean = true, errorHandler?: ExpansionErrorHandler, inheritedByPreset?: WorkflowPreset): Promise { + let preset = getPresetByName(workflowPresets(folder, usePresetsPlusIncluded), name); if (preset) { - return expandWorkflowPresetHelper(folder, preset, workspaceFolder, sourceDir); + const presetList = inheritedByPreset ? inheritedByPreset.__file!.workflowPresets : workflowPresets(folder, usePresetsPlusIncluded); + const validInherit = presetList !== undefined && presetList.filter(p => p.name === name).length > 0; + if (validInherit) { + return getWorkflowPresetInheritsHelper(folder, preset, workspaceFolder, sourceDir, false, usePresetsPlusIncluded, errorHandler); + } } if (allowUserPreset) { - preset = getPresetByName(userWorkflowPresets(folder), name); + preset = getPresetByName(userWorkflowPresets(folder, usePresetsPlusIncluded), name); if (preset) { - return expandWorkflowPresetHelper(folder, preset, workspaceFolder, sourceDir, true); + return getWorkflowPresetInheritsHelper(folder, preset, workspaceFolder, sourceDir, true, usePresetsPlusIncluded, errorHandler); } } @@ -1884,14 +2105,14 @@ async function expandWorkflowPresetImpl(folder: string, name: string, workspaceF } ] }; - return expandWorkflowPresetHelper(folder, preset, workspaceFolder, sourceDir, true); + return getWorkflowPresetInheritsHelper(folder, preset, workspaceFolder, sourceDir, true, usePresetsPlusIncluded, errorHandler); } - log.error(localize('workflow.preset.not.found', 'Could not find workflow preset with name {0}', name)); + errorHandler?.tempErrorList.push([localize('workflow.preset.not.found', 'Could not find workflow preset'), name]); return null; } -async function expandWorkflowPresetHelper(folder: string, preset: WorkflowPreset, workspaceFolder: string, sourceDir: string, allowUserPreset: boolean = false) { +async function getWorkflowPresetInheritsHelper(folder: string, preset: WorkflowPreset, workspaceFolder: string, sourceDir: string, allowUserPreset: boolean = false, enableTryApplyDevEnv: boolean = true, errorHandler?: ExpansionErrorHandler) { if (preset.__expanded) { return preset; } @@ -1901,6 +2122,7 @@ async function expandWorkflowPresetHelper(folder: string, preset: WorkflowPreset if (refs.has(preset.name) && !preset.__expanded) { // Referenced this preset before, but it still hasn't been expanded. So this is a circular inheritance. log.error(localize('circular.inherits.in.workflow.preset', 'Circular inherits in workflow preset {0}', preset.name)); + errorHandler?.errorList.push([localize('circular.inherits.in.workflow.preset', 'Circular inherits in workflow preset'), preset.name]); return null; } @@ -1909,40 +2131,60 @@ async function expandWorkflowPresetHelper(folder: string, preset: WorkflowPreset // Expand configure preset. Evaluate this after inherits since it may come from parents const workflowConfigurePreset = preset.steps[0].name; if (workflowConfigurePreset) { - const configurePreset = await expandConfigurePreset(folder, workflowConfigurePreset, workspaceFolder, sourceDir, allowUserPreset); - if (configurePreset) { - // The below is critical when the workflow step0 configure preset is different than the - // configure preset selected for the project. - // Something that occurs during the usual configure of the project does not happen - // when we configure on the fly and temporary for step0. - for (const step of preset.steps) { - switch (step.type) { - case "build": - const buildStepPr = getPresetByName(allBuildPresets(folder), step.name); - if (buildStepPr) { - buildStepPr.__binaryDir = configurePreset.binaryDir; - buildStepPr.__generator = configurePreset.generator; - } - break; - case "test": - const testStepPr = getPresetByName(allTestPresets(folder), step.name); - if (testStepPr) { - testStepPr.__binaryDir = configurePreset.binaryDir; - testStepPr.__generator = configurePreset.generator; - } - break; - case "package": - const packageStepPr = getPresetByName(allPackagePresets(folder), step.name); - if (packageStepPr) { - packageStepPr.__binaryDir = configurePreset.binaryDir; - packageStepPr.__generator = configurePreset.generator; - } - break; - } - }; - } else { + // We need to still do this for workflow presets because the configure preset could be different than the one selected for the project. + let expandedConfigurePreset: ConfigurePreset | null = null; + if (enableTryApplyDevEnv) { + const configurePresetInherits = await getConfigurePresetInherits(folder, workflowConfigurePreset, allowUserPreset, true, errorHandler); + if (!configurePresetInherits) { + return null; + } + await tryApplyVsDevEnv(configurePresetInherits, workspaceFolder, sourceDir); + + expandedConfigurePreset = await expandConfigurePresetVariables(configurePresetInherits, + folder, + workflowConfigurePreset, + workspaceFolder, + sourceDir, + allowUserPreset, + enableTryApplyDevEnv, + errorHandler); + } else { + expandedConfigurePreset = getPresetByName(configurePresets(folder), workflowConfigurePreset); + } + if (!expandedConfigurePreset) { + log.error(localize('configure.preset.not.found.full', 'Could not find configure preset with name {0}', workflowConfigurePreset)); + errorHandler?.tempErrorList.push([localize('configure.preset.not.found', 'Could not find configure preset'), workflowConfigurePreset]); return null; } + // The below is critical when the workflow step0 configure preset is different than the + // configure preset selected for the project. + // Something that occurs during the usual configure of the project does not happen + // when we configure on the fly and temporary for step0. + for (const step of preset.steps) { + switch (step.type) { + case "build": + const buildStepPr = getPresetByName(allBuildPresets(folder), step.name); + if (buildStepPr) { + buildStepPr.__binaryDir = expandedConfigurePreset.binaryDir; + buildStepPr.__generator = expandedConfigurePreset.generator; + } + break; + case "test": + const testStepPr = getPresetByName(allTestPresets(folder), step.name); + if (testStepPr) { + testStepPr.__binaryDir = expandedConfigurePreset.binaryDir; + testStepPr.__generator = expandedConfigurePreset.generator; + } + break; + case "package": + const packageStepPr = getPresetByName(allPackagePresets(folder), step.name); + if (packageStepPr) { + packageStepPr.__binaryDir = expandedConfigurePreset.binaryDir; + packageStepPr.__generator = expandedConfigurePreset.generator; + } + break; + } + }; } preset.__expanded = true; diff --git a/src/presetsController.ts b/src/presetsController.ts index 8496a9491..eb83512de 100644 --- a/src/presetsController.ts +++ b/src/presetsController.ts @@ -2,6 +2,7 @@ import * as chokidar from 'chokidar'; import * as path from 'path'; import * as vscode from 'vscode'; import * as nls from 'vscode-nls'; +import * as lodash from "lodash"; import { CMakeProject, ConfigureTrigger, ConfigureType } from '@cmt/cmakeProject'; import * as logging from '@cmt/logging'; @@ -9,13 +10,15 @@ import { fs } from '@cmt/pr'; import * as preset from '@cmt/preset'; import * as util from '@cmt/util'; import rollbar from '@cmt/rollbar'; -import { ExpansionOptions, getParentEnvSubstitutions, substituteAll } from '@cmt/expand'; +import { ExpansionErrorHandler, ExpansionOptions, getParentEnvSubstitutions, substituteAll } from '@cmt/expand'; import paths from '@cmt/paths'; import { KitsController } from '@cmt/kitsController'; import { descriptionForKit, Kit, SpecialKits } from '@cmt/kit'; import { getHostTargetArchString } from '@cmt/installs/visualStudio'; import { loadSchema } from '@cmt/schema'; import json5 = require('json5'); +import { Diagnostic, DiagnosticSeverity, Position, Range } from 'vscode'; +import collections from '@cmt/diagnostics/collections'; nls.config({ messageFormat: nls.MessageFormat.bundle, bundleFormat: nls.BundleFormat.standalone })(); const localize: nls.LocalizeFunc = nls.loadMessageBundle(); @@ -24,8 +27,8 @@ const log = logging.createLogger('presetController'); type SetPresetsFileFunc = (folder: string, presets: preset.PresetsFile | undefined) => void; -export class PresetsController { - private _presetsWatcher: chokidar.FSWatcher | undefined; +export class PresetsController implements vscode.Disposable { + private _presetsWatchers: FileWatcher | undefined; private _sourceDir: string = ''; private _sourceDirChangedSub: vscode.Disposable | undefined; private _presetsFileExists = false; @@ -87,6 +90,11 @@ export class PresetsController { await presetsController.reapplyPresets(); }); + // We need to reapply presets to reassess whether the VS Developer Environment should be used. + project.workspaceContext.config.onChange('useVsDeveloperEnvironment', async () => { + await presetsController.reapplyPresets(); + }); + return presetsController; } @@ -130,13 +138,23 @@ export class PresetsController { return this._userPresetsChangedEmitter.event(listener); } - private readonly _setPresetsFile = (folder: string, presetsFile: preset.PresetsFile | undefined) => { - preset.setPresetsFile(folder, presetsFile); + private readonly _setExpandedPresets = (folder: string, presetsFile: preset.PresetsFile | undefined) => { + preset.setExpandedPresets(folder, presetsFile); + this._presetsChangedEmitter.fire(presetsFile); + }; + + private readonly _setExpandedUserPresetsFile = (folder: string, presetsFile: preset.PresetsFile | undefined) => { + preset.setExpandedUserPresetsFile(folder, presetsFile); + this._userPresetsChangedEmitter.fire(presetsFile); + }; + + private readonly _setPresetsPlusIncluded = (folder: string, presetsFile: preset.PresetsFile | undefined) => { + preset.setPresetsPlusIncluded(folder, presetsFile); this._presetsChangedEmitter.fire(presetsFile); }; - private readonly _setUserPresetsFile = (folder: string, presetsFile: preset.PresetsFile | undefined) => { - preset.setUserPresetsFile(folder, presetsFile); + private readonly _setUserPresetsPlusIncluded = (folder: string, presetsFile: preset.PresetsFile | undefined) => { + preset.setUserPresetsPlusIncluded(folder, presetsFile); this._userPresetsChangedEmitter.fire(presetsFile); }; @@ -148,16 +166,15 @@ export class PresetsController { preset.setOriginalUserPresetsFile(folder, presetsFile); }; - private async resetPresetsFile(file: string, setPresetsFile: SetPresetsFileFunc, setOriginalPresetsFile: SetPresetsFileFunc, fileExistCallback: (fileExists: boolean) => void, referencedFiles: Set) { + private async resetPresetsFile(file: string, setExpandedPresets: SetPresetsFileFunc, setPresetsPlusIncluded: SetPresetsFileFunc, setOriginalPresetsFile: SetPresetsFileFunc, fileExistCallback: (fileExists: boolean) => void, referencedFiles: Map) { const presetsFileBuffer = await this.readPresetsFile(file); // There might be a better location for this, but for now this is the best one... fileExistCallback(Boolean(presetsFileBuffer)); // Record the file as referenced, even if the file does not exist. - referencedFiles.add(file); - let presetsFile = await this.parsePresetsFile(presetsFileBuffer, file); + referencedFiles.set(file, presetsFile); if (presetsFile) { // Parse again so we automatically have a copy by value setOriginalPresetsFile(this.folderPath, await this.parsePresetsFile(presetsFileBuffer, file)); @@ -166,24 +183,35 @@ export class PresetsController { } presetsFile = await this.validatePresetsFile(presetsFile, file); - // Private fields must be set after validation, otherwise validation would fail. - this.populatePrivatePresetsFields(presetsFile, file); - await this.mergeIncludeFiles(presetsFile, presetsFile, file, referencedFiles); - // TODO: more validation (or move some of the per file validation here when all entries are merged. - // Like unresolved preset reference or duplicates). - setPresetsFile(this.folderPath, presetsFile); + if (presetsFile) { + // Private fields must be set after validation, otherwise validation would fail. + this.populatePrivatePresetsFields(presetsFile, file); + await this.mergeIncludeFiles(presetsFile, file, referencedFiles); + + const copyOfPresetsFile = lodash.cloneDeep(presetsFile); + // add the include files to the original presets file + setPresetsPlusIncluded(this.folderPath, copyOfPresetsFile); + + const copyAgain = lodash.cloneDeep(copyOfPresetsFile); + // set the pre-expanded version so we can call expandPresetsFile on it + setExpandedPresets(this.folderPath, copyAgain); + presetsFile = await this.expandPresetsFile(copyAgain); + } + + setExpandedPresets(this.folderPath, presetsFile); } // Need to reapply presets every time presets changed since the binary dir or cmake path could change // (need to clean or reload driver) async reapplyPresets() { - const referencedFiles: Set = new Set(); + const referencedFiles: Map = new Map(); // Reset all changes due to expansion since parents could change - await this.resetPresetsFile(this.presetsPath, this._setPresetsFile, this._setOriginalPresetsFile, exists => this._presetsFileExists = exists, referencedFiles); - await this.resetPresetsFile(this.userPresetsPath, this._setUserPresetsFile, this._setOriginalUserPresetsFile, exists => this._userPresetsFileExists = exists, referencedFiles); + await this.resetPresetsFile(this.presetsPath, this._setExpandedPresets, this._setPresetsPlusIncluded, this._setOriginalPresetsFile, exists => this._presetsFileExists = exists, referencedFiles); + await this.resetPresetsFile(this.userPresetsPath, this._setExpandedUserPresetsFile, this._setUserPresetsPlusIncluded, this._setOriginalUserPresetsFile, exists => this._userPresetsFileExists = exists, referencedFiles); - this._referencedFiles = Array.from(referencedFiles); + // reset all expanded presets storage. + this._referencedFiles = Array.from(referencedFiles.keys()); this.project.minCMakeVersion = preset.minCMakeVersion(this.folderPath); @@ -415,7 +443,7 @@ export class PresetsController { if (newPreset) { - const before: preset.ConfigurePreset[] = await this.getAllConfigurePresets(); + const before: preset.ConfigurePreset[] = preset.allConfigurePresets(this.folderPath); const name = await this.showNameInputBox() || newPreset.displayName || undefined; if (!name) { return false; @@ -810,10 +838,31 @@ export class PresetsController { return chosenPresets?.preset; } + // For all of the `getAll` methods, we now can safely grab only the user presets (if present), because they inherently include + // the presets. async getAllConfigurePresets(): Promise { - preset.expandVendorForConfigurePresets(this.folderPath); - await preset.expandConditionsForPresets(this.folderPath, this._sourceDir); - return preset.configurePresets(this.folderPath).concat(preset.userConfigurePresets(this.folderPath)); + const userPresets = preset.userConfigurePresets(this.folderPath); + return userPresets.length > 0 ? userPresets : preset.configurePresets(this.folderPath); + } + + async getAllBuildPresets(): Promise { + const userPresets = preset.userBuildPresets(this.folderPath); + return userPresets.length > 0 ? userPresets : preset.buildPresets(this.folderPath); + } + + async getAllTestPresets(): Promise { + const userPresets = preset.userTestPresets(this.folderPath); + return userPresets.length > 0 ? userPresets : preset.testPresets(this.folderPath); + } + + async getAllPackagePresets(): Promise { + const userPresets = preset.userPackagePresets(this.folderPath); + return userPresets.length > 0 ? userPresets : preset.packagePresets(this.folderPath); + } + + async getAllWorkflowPresets(): Promise { + const userPresets = preset.userWorkflowPresets(this.folderPath); + return userPresets.length > 0 ? userPresets : preset.workflowPresets(this.folderPath); } async selectConfigurePreset(quickStart?: boolean): Promise { @@ -853,7 +902,7 @@ export class PresetsController { await this.setConfigurePreset(chosenPreset); } - if (this.project.workspaceContext.config.automaticReconfigure) { + if (this.project.workspaceContext.config.automaticReconfigure && !quickStart) { await this.project.configureInternal(ConfigureTrigger.selectConfigurePreset, [], ConfigureType.Normal); } return !addPreset || allPresets.length === 0; @@ -926,7 +975,15 @@ export class PresetsController { let currentBuildPreset: string | undefined; if (selectedConfigurePreset) { preset.expandConfigurePresetForPresets(this.folderPath, 'build'); - const buildPresets = preset.allBuildPresets(this.folderPath); + const allPresets = preset.allBuildPresets(this.folderPath); + const buildPresets = (await this.getAllBuildPresets()).filter( + (_preset) => + this.checkCompatibility( + this.project.configurePreset, + _preset + ).buildPresetCompatible && + preset.evaluatePresetCondition(_preset, allPresets) + ); for (const buildPreset of buildPresets) { // Set active build preset as the first valid build preset matches the selected configure preset if (buildPreset.configurePreset === selectedConfigurePreset && !buildPreset.hidden) { @@ -950,7 +1007,15 @@ export class PresetsController { let currentTestPreset: string | undefined; if (selectedConfigurePreset) { preset.expandConfigurePresetForPresets(this.folderPath, 'test'); - const testPresets = preset.allTestPresets(this.folderPath); + const allPresets = preset.allTestPresets(this.folderPath); + const testPresets = (await this.getAllTestPresets()).filter( + (_preset) => + this.checkCompatibility( + this.project.configurePreset, + _preset + ).buildPresetCompatible && + preset.evaluatePresetCondition(_preset, allPresets) + ); for (const testPreset of testPresets) { // Set active test preset as the first valid test preset matches the selected configure preset if (testPreset.configurePreset === selectedConfigurePreset && !testPreset.hidden) { @@ -974,7 +1039,15 @@ export class PresetsController { let currentPackagePreset: string | undefined; if (selectedConfigurePreset) { preset.expandConfigurePresetForPresets(this.folderPath, 'package'); - const packagePresets = preset.allPackagePresets(this.folderPath); + const allPresets = preset.allPackagePresets(this.folderPath); + const packagePresets = (await this.getAllPackagePresets()).filter( + (_preset) => + this.checkCompatibility( + this.project.configurePreset, + _preset + ).buildPresetCompatible && + preset.evaluatePresetCondition(_preset, allPresets) + ); for (const packagePreset of packagePresets) { // Set active package preset as the first valid package preset matches the selected configure preset if (packagePreset.configurePreset === selectedConfigurePreset && !packagePreset.hidden) { @@ -998,7 +1071,15 @@ export class PresetsController { let currentWorkflowPreset: string | undefined; if (selectedConfigurePreset) { preset.expandConfigurePresetForPresets(this.folderPath, 'workflow'); - const workflowPresets = preset.allWorkflowPresets(this.folderPath); + const allPresets = preset.allWorkflowPresets(this.folderPath); + const workflowPresets = (await this.getAllWorkflowPresets()).filter( + (_preset) => + this.checkCompatibility( + this.project.configurePreset, + _preset + ).buildPresetCompatible && + preset.evaluatePresetCondition(_preset, allPresets) + ); for (const workflowPreset of workflowPresets) { // Set active workflow preset as the first valid workflow preset (matching the selected configure preset is not a requirement as for the other presets types) await this.setWorkflowPreset(workflowPreset.name, false/*needToCheckConfigurePreset*/, false/*checkChangingPreset*/); @@ -1051,7 +1132,6 @@ export class PresetsController { } preset.expandConfigurePresetForPresets(this.folderPath, 'build'); - await preset.expandConditionsForPresets(this.folderPath, this._sourceDir); const allPresets = preset.buildPresets(this.folderPath).concat(preset.userBuildPresets(this.folderPath)); const presets = allPresets.filter(_preset => this.checkCompatibility(selectedConfigurePreset, _preset).buildPresetCompatible); @@ -1210,7 +1290,6 @@ export class PresetsController { } preset.expandConfigurePresetForPresets(this.folderPath, 'test'); - await preset.expandConditionsForPresets(this.folderPath, this._sourceDir); const allPresets = preset.testPresets(this.folderPath).concat(preset.userTestPresets(this.folderPath)); const presets = allPresets.filter(_preset => this.checkCompatibility(selectedConfigurePreset, selectedBuildPreset, _preset).testPresetCompatible); @@ -1303,7 +1382,6 @@ export class PresetsController { } preset.expandConfigurePresetForPresets(this.folderPath, 'package'); - await preset.expandConditionsForPresets(this.folderPath, this._sourceDir); const allPresets = preset.packagePresets(this.folderPath).concat(preset.userPackagePresets(this.folderPath)); const presets = allPresets.filter(_preset => this.checkCompatibility(selectedConfigurePreset, selectedBuildPreset, this.project.testPreset, _preset).packagePresetCompatible); @@ -1386,7 +1464,6 @@ export class PresetsController { // which to be the same as in step0. This is verified by CMakePresets.json validation in validatePresetsFile. preset.expandConfigurePresetForPresets(this.folderPath, 'workflow'); - await preset.expandConditionsForPresets(this.folderPath, this._sourceDir); const allPresets = preset.workflowPresets(this.folderPath).concat(preset.userWorkflowPresets(this.folderPath)); allPresets.push(preset.defaultWorkflowPreset); @@ -1525,8 +1602,28 @@ export class PresetsController { setFile(presetsFile.packagePresets); } - private async mergeIncludeFiles(rootPresetsFile: preset.PresetsFile | undefined, presetsFile: preset.PresetsFile | undefined, file: string, referencedFiles: Set): Promise { - if (!rootPresetsFile || !presetsFile || !presetsFile.include) { + private async mergeIncludeFiles(presetsFile: preset.PresetsFile | undefined, file: string, referencedFiles: Map): Promise { + if (!presetsFile) { + return; + } + + // CMakeUserPresets.json file should include CMakePresets.json file, by default. + if (this.presetsFileExist && file === this.userPresetsPath) { + presetsFile.include = presetsFile.include || []; + const filteredIncludes = presetsFile.include.filter(include => { + // Ensuring that we handle expansions. Duplicated from loop below. + const includePath = presetsFile.version >= 7 ? + // Version 7 and later support $penv{} expansions in include paths + substituteAll(include, getParentEnvSubstitutions(include, new Map())).result : + include; + path.normalize(path.resolve(path.dirname(file), includePath)) === this.presetsPath; + }); + if (filteredIncludes.length === 0) { + presetsFile.include.push(this.presetsPath); + } + } + + if (!presetsFile.include) { return; } @@ -1541,10 +1638,33 @@ export class PresetsController { // Do not include files more than once if (referencedFiles.has(fullIncludePath)) { + const referencedIncludeFile = referencedFiles.get(fullIncludePath); + if (referencedIncludeFile) { + if (referencedIncludeFile.configurePresets) { + presetsFile.configurePresets = lodash.unionWith(referencedIncludeFile.configurePresets, presetsFile.configurePresets || [], (a, b) => a.name === b.name); + } + if (referencedIncludeFile.buildPresets) { + presetsFile.buildPresets = lodash.unionWith(referencedIncludeFile.buildPresets, presetsFile.buildPresets || [], (a, b) => a.name === b.name); + } + if (referencedIncludeFile.testPresets) { + presetsFile.testPresets = lodash.unionWith(referencedIncludeFile.testPresets, presetsFile.testPresets || [], (a, b) => a.name === b.name); + } + if (referencedIncludeFile.packagePresets) { + presetsFile.packagePresets = lodash.unionWith(referencedIncludeFile.packagePresets, presetsFile.packagePresets || [], (a, b) => a.name === b.name); + } + if (referencedIncludeFile.workflowPresets) { + presetsFile.workflowPresets = lodash.unionWith(referencedIncludeFile.workflowPresets, presetsFile.workflowPresets || [], (a, b) => a.name === b.name); + } + if (referencedIncludeFile.cmakeMinimumRequired) { + if (!presetsFile.cmakeMinimumRequired || util.versionLess(presetsFile.cmakeMinimumRequired, referencedIncludeFile.cmakeMinimumRequired)) { + presetsFile.cmakeMinimumRequired = referencedIncludeFile.cmakeMinimumRequired; + } + } + } continue; } // Record the file as referenced, even if the file does not exist. - referencedFiles.add(fullIncludePath); + referencedFiles.set(fullIncludePath, undefined); const includeFileBuffer = await this.readPresetsFile(fullIncludePath); if (!includeFileBuffer) { @@ -1553,6 +1673,7 @@ export class PresetsController { } let includeFile = await this.parsePresetsFile(includeFileBuffer, fullIncludePath); + referencedFiles.set(fullIncludePath, includeFile); includeFile = await this.validatePresetsFile(includeFile, fullIncludePath); if (!includeFile) { continue; @@ -1561,30 +1682,198 @@ export class PresetsController { // Private fields must be set after validation, otherwise validation would fail. this.populatePrivatePresetsFields(includeFile, fullIncludePath); - if (includeFile.cmakeMinimumRequired) { - if (!rootPresetsFile.cmakeMinimumRequired || util.versionLess(rootPresetsFile.cmakeMinimumRequired, includeFile.cmakeMinimumRequired)) { - rootPresetsFile.cmakeMinimumRequired = includeFile.cmakeMinimumRequired; - } - } + // Recursively merge included files + await this.mergeIncludeFiles(includeFile, fullIncludePath, referencedFiles); + if (includeFile.configurePresets) { - rootPresetsFile.configurePresets = includeFile.configurePresets.concat(rootPresetsFile.configurePresets || []); + presetsFile.configurePresets = lodash.unionWith(includeFile.configurePresets, presetsFile.configurePresets || [], (a, b) => a.name === b.name); } if (includeFile.buildPresets) { - rootPresetsFile.buildPresets = includeFile.buildPresets.concat(rootPresetsFile.buildPresets || []); + presetsFile.buildPresets = lodash.unionWith(includeFile.buildPresets, presetsFile.buildPresets || [], (a, b) => a.name === b.name); } if (includeFile.testPresets) { - rootPresetsFile.testPresets = includeFile.testPresets.concat(rootPresetsFile.testPresets || []); + presetsFile.testPresets = lodash.unionWith(includeFile.testPresets, presetsFile.testPresets || [], (a, b) => a.name === b.name); } if (includeFile.packagePresets) { - rootPresetsFile.packagePresets = includeFile.packagePresets.concat(rootPresetsFile.packagePresets || []); + presetsFile.packagePresets = lodash.unionWith(includeFile.packagePresets, presetsFile.packagePresets || [], (a, b) => a.name === b.name); } if (includeFile.workflowPresets) { - rootPresetsFile.workflowPresets = includeFile.workflowPresets.concat(rootPresetsFile.workflowPresets || []); + presetsFile.workflowPresets = lodash.unionWith(includeFile.workflowPresets, presetsFile.workflowPresets || [], (a, b) => a.name === b.name); + } + if (includeFile.cmakeMinimumRequired) { + if (!presetsFile.cmakeMinimumRequired || util.versionLess(presetsFile.cmakeMinimumRequired, includeFile.cmakeMinimumRequired)) { + presetsFile.cmakeMinimumRequired = includeFile.cmakeMinimumRequired; + } } + } + } - // Recursively merge included files - await this.mergeIncludeFiles(rootPresetsFile, includeFile, fullIncludePath, referencedFiles); + /** + * Returns the expanded presets file if there are no errors, otherwise returns undefined + * Does not apply vsdevenv to the presets file + */ + private async expandPresetsFile(presetsFile: preset.PresetsFile | undefined): Promise { + + if (!presetsFile) { + return undefined; + } + + const clonedPresetsFile = lodash.cloneDeep(presetsFile); + + log.info(localize('expanding.presets.file', 'Expanding presets file {0}', presetsFile?.__path || '')); + + const expansionErrors: ExpansionErrorHandler = { errorList: [], tempErrorList: []}; + + const expandedConfigurePresets: preset.ConfigurePreset[] = []; + for (const configurePreset of clonedPresetsFile?.configurePresets || []) { + const inheritedPreset = await preset.getConfigurePresetInherits( + this.folderPath, + configurePreset.name, + true, + false, + expansionErrors); + if (inheritedPreset) { + expandedConfigurePresets.push(await preset.expandConfigurePresetVariables( + inheritedPreset, + this.folderPath, + configurePreset.name, + this.workspaceFolder.uri.fsPath, + this._sourceDir, + true, + false, + expansionErrors + )); + } + } + + const expandedBuildPresets: preset.BuildPreset[] = []; + for (const buildPreset of clonedPresetsFile?.buildPresets || []) { + const inheritedPreset = await preset.getBuildPresetInherits( + this.folderPath, + buildPreset.name, + this.workspaceFolder.uri.fsPath, + this._sourceDir, + undefined, + undefined, + true, + buildPreset.configurePreset, + false, + expansionErrors); + if (inheritedPreset) { + expandedBuildPresets.push(await preset.expandBuildPresetVariables( + inheritedPreset, + buildPreset.name, + this.workspaceFolder.uri.fsPath, + this._sourceDir, + expansionErrors + )); + } + } + + const expandedTestPresets: preset.TestPreset[] = []; + for (const testPreset of clonedPresetsFile?.testPresets || []) { + const inheritedPreset = await preset.getTestPresetInherits( + this.folderPath, + testPreset.name, + this.workspaceFolder.uri.fsPath, + this._sourceDir, + undefined, + true, + testPreset.configurePreset, + false, + expansionErrors + ); + if (inheritedPreset) { + expandedTestPresets.push(await preset.expandTestPresetVariables( + inheritedPreset, + testPreset.name, + this.workspaceFolder.uri.fsPath, + this._sourceDir, + expansionErrors + )); + } + } + + const expandedPackagePresets: preset.PackagePreset[] = []; + for (const packagePreset of clonedPresetsFile?.packagePresets || []) { + const inheritedPreset = await preset.getPackagePresetInherits( + this.folderPath, + packagePreset.name, + this.workspaceFolder.uri.fsPath, + this._sourceDir, + undefined, + true, + packagePreset.configurePreset, + false, + expansionErrors + ); + if (inheritedPreset) { + expandedPackagePresets.push(await preset.expandPackagePresetVariables( + inheritedPreset, + packagePreset.name, + this.workspaceFolder.uri.fsPath, + this._sourceDir, + expansionErrors + )); + } + } + + const expandedWorkflowPresets: preset.WorkflowPreset[] = []; + for (const workflowPreset of clonedPresetsFile?.workflowPresets || []) { + const inheritedPreset = await preset.getWorkflowPresetInherits( + this.folderPath, + workflowPreset.name, + this.workspaceFolder.uri.fsPath, + this._sourceDir, + true, // should this always be true? + undefined, // should this always be undefined? + false, + expansionErrors + ); + if (inheritedPreset && inheritedPreset !== null) { + expandedWorkflowPresets.push(inheritedPreset); + } + } + + if (expansionErrors.errorList.length > 0) { + log.error(localize('expansion.errors', 'Expansion errors found in the presets file.')); + await this.reportPresetsFileErrors(clonedPresetsFile.__path, expansionErrors); + return undefined; + } else { + log.info(localize('successfully.expanded.presets.file', 'Successfully expanded presets file {0}', presetsFile?.__path || '')); + + // cache everything that we just expanded + // we'll only need to expand again on set preset - to apply the vs dev env if needed + presetsFile.configurePresets = expandedConfigurePresets; + presetsFile.buildPresets = expandedBuildPresets; + presetsFile.testPresets = expandedTestPresets; + presetsFile.packagePresets = expandedPackagePresets; + presetsFile.workflowPresets = expandedWorkflowPresets; + + // clear out the errors since there are none now + collections.presets.set(vscode.Uri.file(clonedPresetsFile.__path || ""), undefined); + + return presetsFile; + } + } + + private async reportPresetsFileErrors(path: string = "", expansionErrors: ExpansionErrorHandler) { + const diagnostics: Diagnostic[] = []; + for (const error of expansionErrors.errorList) { + // message - error type, source - details & the preset name it's from + const diagnostic: Diagnostic = { + severity: DiagnosticSeverity.Error, + message: error[0], + source: error[1], + range: new Range(new Position(0, 0), new Position(0, 0)) // TODO in the future we can add the range of the error - parse originalPresetsFile + }; + // avoid duplicate diagnostics + if (!diagnostics.find(d => d.message === diagnostic.message && d.source === diagnostic.source)) { + diagnostics.push(diagnostic); + } } + + collections.presets.set(vscode.Uri.file(path), diagnostics); } private async validatePresetsFile(presetsFile: preset.PresetsFile | undefined, file: string) { @@ -1623,7 +1912,7 @@ export class PresetsController { logFunc(localize('unsupported.presets', 'Unsupported presets detected in {0}. Support is limited to features defined by version {1}.', file, maxSupportedVersion)); for (const err of errors) { if (err.params && 'additionalProperty' in err.params) { - logFunc(` >> ${err.dataPath}: ${err.message}: ${err.params.additionalProperty}`); + logFunc(` >> ${err.dataPath}: ${localize('no.additional.properties', 'should NOT have additional properties')}: ${err.params.additionalProperty}`); } else { logFunc(` >> ${err.dataPath}: ${err.message}`); } @@ -1685,7 +1974,7 @@ export class PresetsController { } } - log.info(localize('successfully.validated.presets', 'Successfully validated presets in {0}', file)); + log.info(localize('successfully.validated.presets', 'Successfully validated {0} against presets schema', file)); return presetsFile; } @@ -1756,26 +2045,68 @@ export class PresetsController { return vscode.window.showTextDocument(vscode.Uri.file(presetsFilePath)); } + // this is used for the file watcher on adding a new presets file + async onCreatePresetsFile() { + await this.reapplyPresets(); + await this.project.projectController?.updateActiveProject(this.workspaceFolder); + } + private async watchPresetsChange() { - if (this._presetsWatcher) { - this._presetsWatcher.close().then(() => {}, () => {}); - } - const handler = () => { + const presetChangeHandler = () => { void this.reapplyPresets(); }; - this._presetsWatcher = chokidar.watch(this._referencedFiles, { ignoreInitial: true }) - .on('add', handler) - .on('change', handler) - .on('unlink', handler); + const presetCreatedHandler = () => { + void this.onCreatePresetsFile(); + }; + + const events: Map void> = new Map void>([ + ["change", presetChangeHandler], + ["unlink", presetChangeHandler], + ["add", presetCreatedHandler] + ]); + + this._presetsWatchers?.dispose(); + this._presetsWatchers = new FileWatcher(this._referencedFiles, events, { ignoreInitial: true }); }; dispose() { - if (this._presetsWatcher) { - this._presetsWatcher.close().then(() => {}, () => {}); - } + this._presetsWatchers?.dispose(); + if (this._sourceDirChangedSub) { this._sourceDirChangedSub.dispose(); } } } + +/** + * FileWatcher is a wrapper around chokidar's FSWatcher that allows for watching multiple paths. + * Chokidar's support for watching multiple paths is currently broken, if it is fixed in the future, this class can be removed. + */ +class FileWatcher implements vscode.Disposable { + private watchers: Map; + + public constructor(paths: string | string[], eventHandlers: Map void>, options?: chokidar.WatchOptions) { + this.watchers = new Map(); + + for (const path of Array.isArray(paths) ? paths : [paths]) { + try { + const watcher = chokidar.watch(path, { ...options }); + const eventHandlerEntries = Array.from(eventHandlers); + for (let i = 0; i < eventHandlerEntries.length; i++) { + const [event, handler] = eventHandlerEntries[i]; + watcher.on(event, handler); + } + this.watchers.set(path, watcher); + } catch (error) { + log.error(localize('failed.to.watch', 'Watcher could not be created for {0}: {1}', path, util.errorToString(error))); + } + } + } + + public dispose() { + for (const watcher of this.watchers.values()) { + watcher.close().then(() => {}, () => {}); + } + } +} diff --git a/src/projectOutline/projectOutline.ts b/src/projectOutline/projectOutline.ts index 79083922a..335cf658d 100644 --- a/src/projectOutline/projectOutline.ts +++ b/src/projectOutline/projectOutline.ts @@ -501,6 +501,11 @@ export class ProjectNode extends BaseNode { children.push(new SourceFileNode(this.id, this.folder, this.sourceDirectory, possiblePreset)); } + const possibleUserPreset = path.join(this.sourceDirectory, 'CMakeUserPresets.json'); + if (fs.existsSync(possibleUserPreset)) { + children.push(new SourceFileNode(this.id, this.folder, this.sourceDirectory, possibleUserPreset)); + } + return children; } diff --git a/src/projectStatus.ts b/src/projectStatus.ts index 4309195d0..a0098e458 100644 --- a/src/projectStatus.ts +++ b/src/projectStatus.ts @@ -846,7 +846,7 @@ class ConfigPreset extends Node { } const config = (await treeDataProvider.cmakeProject.getCMakeDriverInstance())?.config; if (config && checkConfigureOverridesPresent(config)) { - this.description = "Override settings applied"; + this.description = localize("override.settings.applied", "Override settings applied"); this.contextValue = 'configPreset - overrides present'; } else { this.description = ""; @@ -886,7 +886,7 @@ class BuildPreset extends Node { const config = (await treeDataProvider.cmakeProject.getCMakeDriverInstance())?.config; if (config && checkBuildOverridesPresent(config)) { - this.description = "Override settings applied"; + this.description = localize("override.settings.applied", "Override settings applied"); this.contextValue = 'buildPreset - overrides present'; } else { this.description = ""; @@ -926,7 +926,7 @@ class TestPreset extends Node { const config = (await treeDataProvider.cmakeProject.getCMakeDriverInstance())?.config; if (config && checkTestOverridesPresent(config)) { - this.description = "Override settings applied"; + this.description = localize("override.settings.applied", "Override settings applied"); this.contextValue = 'testPreset - overrides present'; } else { this.description = ""; @@ -967,7 +967,7 @@ class PackagePreset extends Node { const config = (await treeDataProvider.cmakeProject.getCMakeDriverInstance())?.config; if (config && checkPackageOverridesPresent(config)) { - this.description = "Override settings applied"; + this.description = localize("override.settings.applied", "Override settings applied"); this.contextValue = 'packagePreset - overrides present'; } else { this.description = ""; diff --git a/src/rollbar.ts b/src/rollbar.ts index 521e74679..0d947c61f 100644 --- a/src/rollbar.ts +++ b/src/rollbar.ts @@ -6,12 +6,21 @@ import * as logging from './logging'; import * as nls from 'vscode-nls'; import * as path from 'path'; import { logEvent } from './telemetry'; +import * as lodash from "lodash"; nls.config({ messageFormat: nls.MessageFormat.bundle, bundleFormat: nls.BundleFormat.standalone })(); const localize: nls.LocalizeFunc = nls.loadMessageBundle(); const log = logging.createLogger('rollbar'); +function stringifyReplacer(key: any, value: any) { + if (key === "extensionContext") { + return undefined; + } + + return value; +} + /** * Remove filesystem information from stack traces before logging telemetry * @param stack The call stack string @@ -68,7 +77,11 @@ class RollbarController { * @returns The LogResult if we are enabled. `null` otherwise. */ exception(what: string, exception: Error, additional: object = {}): void { - log.fatal(localize('unhandled.exception', 'Unhandled exception: {0}', what), exception, JSON.stringify(additional)); + try { + log.fatal(localize('unhandled.exception', 'Unhandled exception: {0}', what), exception, JSON.stringify(additional, (key, value) => stringifyReplacer(key, value))); + } catch (e) { + log.fatal(localize('unhandled.exception', 'Unhandled exception: {0}', what), exception, lodash.toString(additional)); + } const callstack = cleanStack(exception.stack); const message = cleanString(exception.message); logEvent('exception2', { message, callstack }); @@ -83,12 +96,12 @@ class RollbarController { * @returns The LogResult if we are enabled. `null` otherwise. */ error(what: string, additional: object = {}): void { - log.error(what, JSON.stringify(additional)); + log.error(what, JSON.stringify(additional, (key, value) => stringifyReplacer(key, value))); debugger; } info(what: string, additional: object = {}): void { - log.info(what, JSON.stringify(additional)); + log.info(what, JSON.stringify(additional, (key, value) => stringifyReplacer(key, value))); } /** diff --git a/src/util.ts b/src/util.ts index 43532ddbb..65e981b98 100644 --- a/src/util.ts +++ b/src/util.ts @@ -976,8 +976,8 @@ export function runCommand(key: keyof ExtensionManager, ...args: any[]) { } export async function globForFileName(fileName: string, depth: number, cwd: string): Promise { - let starString = "*"; - for (let i = 1; i <= depth; i++) { + let starString = "."; + for (let i = 0; i <= depth; i++) { if (await globWrapper(`${starString}/${fileName}`, cwd)) { return true; } diff --git a/src/variant.ts b/src/variant.ts index 49e240d61..fdab033e7 100644 --- a/src/variant.ts +++ b/src/variant.ts @@ -168,6 +168,11 @@ export const DEFAULT_VARIANTS: VarFileRoot = { short: 'RelWithDebInfo', long: localize('optimize.and.debug', 'Perform optimizations AND include debugging information'), buildType: 'RelWithDebInfo' + }, + unspecified: { + short: 'Unspecified', + long: localize('unspec.build.type', 'Let CMake pick the default build type'), + buildType: 'Unspecified' } } } @@ -190,6 +195,11 @@ export class VariantManager implements vscode.Disposable { private readonly _variantFileWatcher = chokidar.watch([], { ignoreInitial: true, followSymlinks: false }); private customVariantsFileExists: boolean = false; + /** + * Whether the variant manager has been initialized + */ + private initialized: boolean = false; + dispose() { void this._variantFileWatcher.close(); this._activeVariantChanged.dispose(); @@ -233,14 +243,16 @@ export class VariantManager implements vscode.Disposable { this.customVariantsFileExists = false; const validate = await loadSchema('./schemas/variants-schema.json'); - if (!filepath || !await fs.exists(filepath)) { - const workspaceFolder: string = this.workspaceFolder.uri.fsPath; - const candidates = [ - path.join(workspaceFolder, 'cmake-variants.json'), - path.join(workspaceFolder, 'cmake-variants.yaml'), - path.join(workspaceFolder, '.vscode/cmake-variants.json'), - path.join(workspaceFolder, '.vscode/cmake-variants.yaml') - ]; + // Variants file should be one of these four options + const workspaceFolder: string = this.workspaceFolder.uri.fsPath; + const candidates = [ + path.join(workspaceFolder, 'cmake-variants.json'), + path.join(workspaceFolder, 'cmake-variants.yaml'), + path.join(workspaceFolder, '.vscode/cmake-variants.json'), + path.join(workspaceFolder, '.vscode/cmake-variants.yaml') + ]; + + if (!filepath || !await fs.exists(filepath) || !candidates.includes(filepath)) { for (const testpath of candidates) { if (await fs.exists(testpath)) { filepath = testpath; @@ -329,7 +341,7 @@ export class VariantManager implements vscode.Disposable { const invalid_variant = { key: '__invalid__', short: 'Unknown', - long: 'Unknwon' + long: 'Unknown' }; const kws = this.stateManager.getActiveVariantSettings(this.folderName, this.isMultiProject); if (!kws) { @@ -433,5 +445,11 @@ export class VariantManager implements vscode.Disposable { const defaultChoices = this.findDefaultChoiceCombination(); await this.publishActiveKeywordSettings(defaultChoices); } + + this.initialized = true; + } + + hasInitialized(): boolean { + return this.initialized; } } diff --git a/test/extension-tests/single-root-UI/project-folder/CMakeUserPresets.json b/test/extension-tests/single-root-UI/project-folder/CMakeUserPresets.json index bed8ca6fb..e85796119 100644 --- a/test/extension-tests/single-root-UI/project-folder/CMakeUserPresets.json +++ b/test/extension-tests/single-root-UI/project-folder/CMakeUserPresets.json @@ -44,6 +44,10 @@ "environment": { "TEST_VARIANT_ENV": "0cbfb6ae-f2ec-4017-8ded-89df8759c502" } + }, + { + "name": "TestInheritFromPreset", + "inherits": "Linux1" } ] -} \ No newline at end of file +} diff --git a/test/extension-tests/single-root-UI/test/include-presets.test.ts b/test/extension-tests/single-root-UI/test/include-presets.test.ts index 4efc53bf6..ae6072f95 100644 --- a/test/extension-tests/single-root-UI/test/include-presets.test.ts +++ b/test/extension-tests/single-root-UI/test/include-presets.test.ts @@ -69,4 +69,9 @@ suite('Preset include functionality', () => { const result = await testEnv.result.getResultAsJson(); expect(result['cookie']).to.eq('passed-cookie'); }).timeout(100000); + + test('Configure CMakeUserPreset inheriting from CMakePreset', async function (this: Mocha.Context) { + await vscode.commands.executeCommand('cmake.setConfigurePreset', 'TestInheritFromPreset'); + expect(await vscode.commands.executeCommand('cmake.showConfigureCommand')).to.be.eq(0); + }).timeout(100000); }); diff --git a/test/helpers/testprogram/test-program-result.ts b/test/helpers/testprogram/test-program-result.ts index d103889bf..f6cdc0a24 100644 --- a/test/helpers/testprogram/test-program-result.ts +++ b/test/helpers/testprogram/test-program-result.ts @@ -17,7 +17,7 @@ export class TestProgramResult { } public async getResultAsJson(): Promise { - expect(this.isPresent).to.eq(true, 'Test programm result file was not found'); + expect(this.isPresent).to.eq(true, 'Test program result file was not found'); const content = fs.readFileSync(this._result_file_location); expect(content.toLocaleString()).to.not.eq(''); diff --git a/test/unit-tests/config.test.ts b/test/unit-tests/config.test.ts index 217caee5f..bc071cc75 100644 --- a/test/unit-tests/config.test.ts +++ b/test/unit-tests/config.test.ts @@ -47,7 +47,7 @@ function createConfig(conf: Partial): Configurat mergedCompileCommands: null, copyCompileCommands: null, loadCompileCommands: true, - configureOnOpen: null, + configureOnOpen: true, configureOnEdit: true, deleteBuildDirOnCleanConfigure: false, skipConfigureIfCachePresent: null, @@ -70,6 +70,7 @@ function createConfig(conf: Partial): Configurat statusBarVisibility: "visible" }, useCMakePresets: 'never', + useVsDeveloperEnvironment: 'auto', allowCommentsInPresetsFile: false, allowUnsupportedPresetsVersions: false, launchBehavior: 'reuseTerminal', diff --git a/test/unit-tests/diagnostics.test.ts b/test/unit-tests/diagnostics.test.ts index 4651957ef..234fc4e8f 100644 --- a/test/unit-tests/diagnostics.test.ts +++ b/test/unit-tests/diagnostics.test.ts @@ -10,9 +10,10 @@ import { expect } from 'chai'; import * as diags from '@cmt/diagnostics/build'; import { OutputConsumer } from '../../src/proc'; import { ExtensionConfigurationSettings, ConfigurationReader } from '../../src/config'; -import { platformPathEquivalent } from '@cmt/util'; +import { platformPathEquivalent, resolvePath } from '@cmt/util'; import { CMakeOutputConsumer } from '@cmt/diagnostics/cmake'; import { populateCollection } from '@cmt/diagnostics/util'; +import { getTestResourceFilePath } from '@test/util'; function feedLines(consumer: OutputConsumer, output: string[], error: string[]) { for (const line of output) { @@ -259,11 +260,11 @@ suite('Diagnostics', () => { expect(path.posix.normalize(diag.file)).to.eq(diag.file); expect(path.posix.isAbsolute(diag.file)).to.be.true; }); - test('Parsing non-diagnostic', () => { + test('Parsing non-diagnostic', async () => { const lines = ['/usr/include/c++/10/bits/stl_vector.h:98:47: optimized: basic block part vectorized using 32 byte vectors']; feedLines(build_consumer, [], lines); expect(build_consumer.compilers.gcc.diagnostics).to.have.length(1); - const resolved = build_consumer.resolveDiagnostics('dummyPath'); + const resolved = await build_consumer.resolveDiagnostics('dummyPath'); expect(resolved.length).to.eq(0); }); test('Parsing linker error', () => { @@ -480,4 +481,25 @@ suite('Diagnostics', () => { expect(diagnostic.message).to.eq('cannot open source file "kjlkjl"\nsearched: "C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench\n8.0\\arm\\inc\\"\ncurrent directory: "C:\\Users\\user\\Documents"'); expect(diagnostic.severity).to.eq('error'); }); + + test('Relative file resolution', async () => { + const project_dir = getTestResourceFilePath('driver/workspace/test_project'); + build_consumer.config.updatePartial({ enabledOutputParsers: [ 'gcc' ] }); + + const lines = ['main.cpp:42:42: error: test warning']; + feedLines(build_consumer, [], lines); + expect(build_consumer.compilers.gcc.diagnostics).to.have.length(1); + + /* default behavior resolve in build-dir */ + let resolved = await build_consumer.resolveDiagnostics('dummyPath'); + expect(resolved.length).to.eq(1); + let diagnostic = resolved[0]; + expect(diagnostic.filepath).to.eq('dummyPath/main.cpp'); + + /* resolve first path where file exists (fallback on first argument) */ + resolved = await build_consumer.resolveDiagnostics('dummyPath', path.resolve(project_dir, 'build'), project_dir, 'dummyPath2'); + expect(resolved.length).to.eq(1); + diagnostic = resolved[0]; + expect(diagnostic.filepath).to.eq(resolvePath('main.cpp', project_dir)); + }); }); diff --git a/test/unit-tests/driver/driver-codemodel-tests.ts b/test/unit-tests/driver/driver-codemodel-tests.ts index 7b79965e1..6281bfd7a 100644 --- a/test/unit-tests/driver/driver-codemodel-tests.ts +++ b/test/unit-tests/driver/driver-codemodel-tests.ts @@ -80,7 +80,7 @@ export function makeCodeModelDriverTestsuite(driverName: string, driver_generato const config = ConfigurationReader.create(); const executable = await getCMakeExecutableInformation(cmakePath); - driver = await driver_generator(executable, config, kitDefault, workspaceFolder, async () => {}, []); + driver = await driver_generator(executable, config, kitDefault, workspaceFolder, async () => true, []); let code_model: null | CodeModelContent = null; if (driver && !(driver instanceof CMakeLegacyDriver)) { driver.onCodeModelChanged(cm => { diff --git a/test/unit-tests/driver/driver-test.ts b/test/unit-tests/driver/driver-test.ts index 7d19313e6..51ccbc60f 100644 --- a/test/unit-tests/driver/driver-test.ts +++ b/test/unit-tests/driver/driver-test.ts @@ -85,7 +85,7 @@ export function makeDriverTestsuite(driverName: string, driver_generator: (cmake const config = ConfigurationReader.create(); const executable = await getCMakeExecutableInformation(cmakePath); - driver = await driver_generator(executable, config, ninjaKitDefault, defaultWorkspaceFolder, async () => {}, []); + driver = await driver_generator(executable, config, ninjaKitDefault, defaultWorkspaceFolder, async () => true, []); const allTargetName = driver.allTargetName; expect(allTargetName).to.eq('all'); @@ -96,7 +96,7 @@ export function makeDriverTestsuite(driverName: string, driver_generator: (cmake const config = ConfigurationReader.create(); const executable = await getCMakeExecutableInformation(cmakePath); - driver = await driver_generator(executable, config, ninjaKitDefault, defaultWorkspaceFolder, async () => {}, []); + driver = await driver_generator(executable, config, ninjaKitDefault, defaultWorkspaceFolder, async () => true, []); expect(driver.binaryDir).to.endsWith('test/unit-tests/driver/workspace/test_project/build'); }).timeout(60000); @@ -104,7 +104,7 @@ export function makeDriverTestsuite(driverName: string, driver_generator: (cmake const config = ConfigurationReader.create(); const executable = await getCMakeExecutableInformation(cmakePath); - driver = await driver_generator(executable, config, ninjaKitDefault, badCommandWorkspaceFolder, async () => {}, []); + driver = await driver_generator(executable, config, ninjaKitDefault, badCommandWorkspaceFolder, async () => true, []); expect((await driver.cleanConfigure(ConfigureTrigger.runTests, [])).result).to.be.eq(1); }).timeout(90000); @@ -112,7 +112,7 @@ export function makeDriverTestsuite(driverName: string, driver_generator: (cmake const config = ConfigurationReader.create(); const executable = await getCMakeExecutableInformation(cmakePath); - driver = await driver_generator(executable, config, ninjaKitDefault, defaultWorkspaceFolder, async () => {}, []); + driver = await driver_generator(executable, config, ninjaKitDefault, defaultWorkspaceFolder, async () => true, []); expect((await driver.cleanConfigure(ConfigureTrigger.runTests, [])).result).to.be.eq(0); expect(await driver.build([driver.allTargetName])).to.be.eq(0); @@ -133,7 +133,7 @@ export function makeDriverTestsuite(driverName: string, driver_generator: (cmake const kit = { name: 'GCC', preferredGenerator: { name: 'invalid Name' } } as Kit; try { - await driver_generator(executable, config, kit, defaultWorkspaceFolder, async () => {}, []); + await driver_generator(executable, config, kit, defaultWorkspaceFolder, async () => true, []); expect(false, 'configure did not detect the invalid generator').to.be.true; } catch (e) { if (!(e instanceof NoGeneratorError)) { @@ -145,7 +145,7 @@ export function makeDriverTestsuite(driverName: string, driver_generator: (cmake test('Test compiler name reporting for telemetry', async () => { const config = ConfigurationReader.create(); const executable = await getCMakeExecutableInformation(cmakePath); - driver = await driver_generator(executable, config, ninjaKitDefault, defaultWorkspaceFolder, async () => {}, []); + driver = await driver_generator(executable, config, ninjaKitDefault, defaultWorkspaceFolder, async () => true, []); // A few path examples that would exercise through the telemetry reporting rules: // - any name that is not recognized is reported as "other" @@ -172,7 +172,7 @@ export function makeDriverTestsuite(driverName: string, driver_generator: (cmake const config = ConfigurationReader.create(); const executable = await getCMakeExecutableInformation(cmakePath); - driver = await driver_generator(executable, config, ninjaKitDefault, defaultWorkspaceFolder, async () => {}, []); + driver = await driver_generator(executable, config, ninjaKitDefault, defaultWorkspaceFolder, async () => true, []); // Set kit without a preferred generator await driver.setKit({ name: 'GCC', isTrusted: true }, []); @@ -195,6 +195,7 @@ export function makeDriverTestsuite(driverName: string, driver_generator: (cmake const checkPreconditionHelper = async (e: CMakePreconditionProblems) => { expect(e).to.be.eq(CMakePreconditionProblems.MissingCMakeListsFile); called = true; + return false; }; driver = await driver_generator(executable, config, ninjaKitDefault, emptyWorkspaceFolder, checkPreconditionHelper, []); expect((await driver.cleanConfigure(ConfigureTrigger.runTests, [])).result).to.be.eq(-2); @@ -209,6 +210,7 @@ export function makeDriverTestsuite(driverName: string, driver_generator: (cmake const checkPreconditionHelper = async (e: CMakePreconditionProblems) => { expect(e).to.be.eq(CMakePreconditionProblems.ConfigureIsAlreadyRunning); called = true; + return false; }; driver = await driver_generator(executable, config, ninjaKitDefault, defaultWorkspaceFolder, checkPreconditionHelper, []); const configure1 = driver.configure(ConfigureTrigger.runTests, []); @@ -227,6 +229,7 @@ export function makeDriverTestsuite(driverName: string, driver_generator: (cmake const checkPreconditionHelper = async (e: CMakePreconditionProblems) => { expect(e).to.be.eq(CMakePreconditionProblems.ConfigureIsAlreadyRunning); called = true; + return false; }; driver = await driver_generator(executable, config, ninjaKitDefault, defaultWorkspaceFolder, checkPreconditionHelper, []); @@ -247,6 +250,7 @@ export function makeDriverTestsuite(driverName: string, driver_generator: (cmake if (e === CMakePreconditionProblems.BuildIsAlreadyRunning) { called = true; } + return false; }; driver = await driver_generator(executable, config, ninjaKitDefault, defaultWorkspaceFolder, checkPreconditionHelper, []); @@ -268,6 +272,7 @@ export function makeDriverTestsuite(driverName: string, driver_generator: (cmake if (e === CMakePreconditionProblems.ConfigureIsAlreadyRunning) { called = true; } + return false; }; driver = await driver_generator(executable, config, ninjaKitDefault, defaultWorkspaceFolder, checkPreconditionHelper, []); @@ -289,6 +294,7 @@ export function makeDriverTestsuite(driverName: string, driver_generator: (cmake if (e === CMakePreconditionProblems.BuildIsAlreadyRunning) { called = true; } + return false; }; driver = await driver_generator(executable, config, ninjaKitDefault, defaultWorkspaceFolder, checkPreconditionHelper, []); @@ -310,6 +316,7 @@ export function makeDriverTestsuite(driverName: string, driver_generator: (cmake if (e === CMakePreconditionProblems.ConfigureIsAlreadyRunning) { called = true; } + return false; }; driver = await driver_generator(executable, config, ninjaKitDefault, defaultWorkspaceFolder, checkPreconditionHelper, []); @@ -330,6 +337,7 @@ export function makeDriverTestsuite(driverName: string, driver_generator: (cmake if (e === CMakePreconditionProblems.BuildIsAlreadyRunning) { called = true; } + return false; }; driver = await driver_generator(executable, config, ninjaKitDefault, defaultWorkspaceFolder, checkPreconditionHelper, []); expect((await driver.configure(ConfigureTrigger.runTests, [])).result).to.be.equal(0); @@ -345,12 +353,12 @@ export function makeDriverTestsuite(driverName: string, driver_generator: (cmake const config = ConfigurationReader.create(); const executable = await getCMakeExecutableInformation(cmakePath); - driver = await driver_generator(executable, config, secondaryKit, defaultWorkspaceFolder, async () => {}, []); + driver = await driver_generator(executable, config, secondaryKit, defaultWorkspaceFolder, async () => true, []); await driver.cleanConfigure(ConfigureTrigger.runTests, []); await driver.asyncDispose(); driver = null; - driver = await driver_generator(executable, config, ninjaKitDefault, defaultWorkspaceFolder, async () => {}, []); + driver = await driver_generator(executable, config, ninjaKitDefault, defaultWorkspaceFolder, async () => true, []); expect((await driver.configure(ConfigureTrigger.runTests, [])).result).to.be.eq(0); const expFileApi = driver instanceof CMakeFileApiDriver; @@ -368,7 +376,7 @@ export function makeDriverTestsuite(driverName: string, driver_generator: (cmake const config = ConfigurationReader.create(); const executable = await getCMakeExecutableInformation(cmakePath); - driver = await driver_generator(executable, config, ninjaKitDefault, defaultWorkspaceFolder, async () => {}, []); + driver = await driver_generator(executable, config, ninjaKitDefault, defaultWorkspaceFolder, async () => true, []); await driver.cleanConfigure(ConfigureTrigger.runTests, []); expect(driver.cmakeCacheEntries.get('CMAKE_GENERATOR')!.value).to.be.eq('Ninja'); @@ -397,7 +405,7 @@ export function makeDriverTestsuite(driverName: string, driver_generator: (cmake const config = ConfigurationReader.create(); const executable = await getCMakeExecutableInformation(cmakePath); - driver = await driver_generator(executable, config, secondaryKit, defaultWorkspaceFolder, async () => {}, []); + driver = await driver_generator(executable, config, secondaryKit, defaultWorkspaceFolder, async () => true, []); await driver.cleanConfigure(ConfigureTrigger.runTests, []); expect(await driver.build(['all'])).to.be.eq(0, 'Automatic correction of all target failed'); }).timeout(90000); @@ -409,7 +417,7 @@ export function makeDriverTestsuite(driverName: string, driver_generator: (cmake const config = ConfigurationReader.create(); const executable = await getCMakeExecutableInformation(cmakePath); - driver = await driver_generator(executable, config, ninjaKitDefault, defaultWorkspaceFolder, async () => {}, []); + driver = await driver_generator(executable, config, ninjaKitDefault, defaultWorkspaceFolder, async () => true, []); await driver.cleanConfigure(ConfigureTrigger.runTests, []); expect(await driver.build(['ALL_BUILD'])).to.be.eq(0, 'Automatic correction of ALL_BUILD target failed'); }).timeout(90000); @@ -418,7 +426,7 @@ export function makeDriverTestsuite(driverName: string, driver_generator: (cmake const config = ConfigurationReader.create(); const executable = await getCMakeExecutableInformation(cmakePath); - driver = await driver_generator(executable, config, ninjaKitDefault, defaultWorkspaceFolder, async () => {}, []); + driver = await driver_generator(executable, config, ninjaKitDefault, defaultWorkspaceFolder, async () => true, []); await driver.configure(ConfigureTrigger.runTests, ['-DEXTRA_ARGS_TEST=Hallo']); expect(driver.cmakeCacheEntries.get('extraArgsEnvironment')?.value).to.be.eq('Hallo'); }).timeout(90000); @@ -427,7 +435,7 @@ export function makeDriverTestsuite(driverName: string, driver_generator: (cmake const config = ConfigurationReader.create(); const executable = await getCMakeExecutableInformation(cmakePath); - driver = await driver_generator(executable, config, ninjaKitDefault, defaultWorkspaceFolder, async () => {}, []); + driver = await driver_generator(executable, config, ninjaKitDefault, defaultWorkspaceFolder, async () => true, []); await driver.cleanConfigure(ConfigureTrigger.runTests, ['-DEXTRA_ARGS_TEST=Hallo']); expect(driver.cmakeCacheEntries.get('extraArgsEnvironment')?.value).to.be.eq('Hallo'); }).timeout(90000); diff --git a/test/unit-tests/presets.test.ts b/test/unit-tests/presets.test.ts index bf2e7bc3d..f7a073b5e 100644 --- a/test/unit-tests/presets.test.ts +++ b/test/unit-tests/presets.test.ts @@ -1,5 +1,6 @@ import { Condition, evaluateCondition, getArchitecture, getToolset } from '../../src/preset'; import { expect } from '@test/util'; +import * as os from "os"; suite('Preset tests', () => { test('Parse architecture', () => { @@ -7,7 +8,15 @@ suite('Preset tests', () => { expect(getArchitecture({ name: 'test', architecture: 'amd64' })).to.eq('amd64'); expect(getArchitecture({ name: 'test', architecture: { value: 'arm', strategy: 'set' } })).to.eq('arm'); expect(getArchitecture({ name: 'test', architecture: { value: 'arm64', strategy: 'external' } })).to.eq('arm64'); - expect(getArchitecture({ name: 'test' })).to.eq('x86'); + if (os.arch() === "arm64") { + expect(getArchitecture({ name: "test" })).to.eq("arm64"); + } else if (os.arch() === "arm") { + expect(getArchitecture({ name: "test" })).to.eq("arm"); + } else if (os.arch() === "x32" || os.arch() === "ia32") { + expect(getArchitecture({ name: "test" })).to.eq("x86"); + } else { + expect(getArchitecture({ name: "test" })).to.eq("x64"); + } expect(getArchitecture({ name: 'test', architecture: 'bogus' })).to.eq('bogus'); }); diff --git a/tsconfig.json b/tsconfig.json index 42d086d77..4cc4364ac 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,7 +1,7 @@ { "compilerOptions": { "module": "commonjs", - "target": "es2017", + "target": "es2018", "outDir": "out", "baseUrl": "./", "lib": [ diff --git a/yarn.lock b/yarn.lock index 7c194f093..9e1f78819 100644 --- a/yarn.lock +++ b/yarn.lock @@ -446,6 +446,11 @@ resolved "https://registry.npmjs.org/@types/json5/-/json5-0.0.30.tgz" integrity sha512-sqm9g7mHlPY/43fcSNrCYfOeX9zkTTK+euO5E6+CVijSMm5tTjkVdwdqRkY3ljjIAf8679vps5jKUoJBCLsMDA== +"@types/lodash@4.14.202": + version "4.14.202" + resolved "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.202.tgz#f09dbd2fb082d507178b2f2a5c7e74bd72ff98f8" + integrity sha512-OvlIYQK9tNneDlS0VN54LLd5uiPCBOp7gS5Z0f1mjoJYBrtStzgmJBxONW3U6OZqdtNzZPmn9BS/7WI7BFFcFQ== + "@types/minimatch@*", "@types/minimatch@^3.0.3": version "3.0.5" resolved "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz" @@ -1110,11 +1115,6 @@ async-settle@^1.0.0: dependencies: async-done "^1.2.2" -asynckit@^0.4.0: - version "0.4.0" - resolved "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz" - integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== - at-least-node@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz" @@ -1130,15 +1130,6 @@ available-typed-arrays@^1.0.5: resolved "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz" integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== -axios@^1.6.1: - version "1.6.2" - resolved "https://registry.npmjs.org/axios/-/axios-1.6.2.tgz" - integrity sha512-7i24Ri4pmDRfJTR7LDBhsOTtcm+9kjX5WiY1X3wIisx6G9So3pfMkEiU7emUBe46oceVImccTEM3k6C5dbVW8A== - dependencies: - follow-redirects "^1.15.0" - form-data "^4.0.0" - proxy-from-env "^1.1.0" - azure-devops-node-api@^11.0.1: version "11.1.1" resolved "https://registry.npmjs.org/azure-devops-node-api/-/azure-devops-node-api-11.1.1.tgz" @@ -1569,13 +1560,6 @@ colorette@^2.0.14: resolved "https://registry.npmjs.org/colorette/-/colorette-2.0.16.tgz" integrity sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g== -combined-stream@^1.0.8: - version "1.0.8" - resolved "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz" - integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== - dependencies: - delayed-stream "~1.0.0" - commander@^2.12.1, commander@^2.20.0: version "2.20.3" resolved "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz" @@ -1861,11 +1845,6 @@ define-property@^2.0.2: is-descriptor "^1.0.2" isobject "^3.0.1" -delayed-stream@~1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" - integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== - delegates@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz" @@ -2781,11 +2760,6 @@ flush-write-stream@^1.0.2: inherits "^2.0.3" readable-stream "^2.3.6" -follow-redirects@^1.15.0: - version "1.15.6" - resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz" - integrity sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA== - for-each@^0.3.3: version "0.3.3" resolved "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz" @@ -2805,15 +2779,6 @@ for-own@^1.0.0: dependencies: for-in "^1.0.1" -form-data@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz" - integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.8" - mime-types "^2.1.12" - fragment-cache@^0.2.1: version "0.2.1" resolved "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz" @@ -4310,7 +4275,7 @@ mime-db@1.52.0: resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz" integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== -mime-types@^2.1.12, mime-types@^2.1.27: +mime-types@^2.1.27: version "2.1.35" resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz" integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== @@ -5094,11 +5059,6 @@ progress@^2.0.0: resolved "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz" integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== -proxy-from-env@^1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz" - integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== - prr@~1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz" @@ -6045,12 +6005,10 @@ tar-stream@^2.1.4: inherits "^2.0.3" readable-stream "^3.1.1" -tas-client@0.1.73: - version "0.1.73" - resolved "https://registry.npmjs.org/tas-client/-/tas-client-0.1.73.tgz" - integrity sha512-UDdUF9kV2hYdlv+7AgqP2kXarVSUhjK7tg1BUflIRGEgND0/QoNpN64rcEuhEcM8AIbW65yrCopJWqRhLZ3m8w== - dependencies: - axios "^1.6.1" +tas-client@0.2.33: + version "0.2.33" + resolved "https://registry.yarnpkg.com/tas-client/-/tas-client-0.2.33.tgz#451bf114a8a64748030ce4068ab7d079958402e6" + integrity sha512-V+uqV66BOQnWxvI6HjDnE4VkInmYZUQ4dgB7gzaDyFyFSK1i1nF/j7DpS9UbQAgV9NaF1XpcyuavnM1qOeiEIg== terser-webpack-plugin@^5.1.3: version "5.3.1" @@ -6637,11 +6595,11 @@ vscode-nls@^5.0.0: integrity sha512-hHQV6iig+M21lTdItKPkJAaWrxALQb/nqpVffakO4knJOh3DrU2SXOMzUzNgo1eADPzu3qSsJY1weCzvR52q9A== vscode-tas-client@^0.1.45: - version "0.1.75" - resolved "https://registry.npmjs.org/vscode-tas-client/-/vscode-tas-client-0.1.75.tgz" - integrity sha512-/+ALFWPI4U3obeRvLFSt39guT7P9bZQrkmcLoiS+2HtzJ/7iPKNt5Sj+XTiitGlPYVFGFc0plxX8AAp6Uxs0xQ== + version "0.1.84" + resolved "https://registry.yarnpkg.com/vscode-tas-client/-/vscode-tas-client-0.1.84.tgz#906bdcfd8c9e1dc04321d6bc0335184f9119968e" + integrity sha512-rUTrUopV+70hvx1hW5ebdw1nd6djxubkLvVxjGdyD/r5v/wcVF41LIfiAtbm5qLZDtQdsMH1IaCuDoluoIa88w== dependencies: - tas-client "0.1.73" + tas-client "0.2.33" watchpack@^2.4.0: version "2.4.0"