microsoft / vscode-cmake-tools

CMake integration in Visual Studio Code
https://marketplace.visualstudio.com/items?itemName=vector-of-bool.cmake-tools
MIT License
1.46k stars 449 forks source link

Why CMAKE_BUILD_TYPE is always Debug? #3821

Closed zchrissirhcz closed 2 months ago

zchrissirhcz commented 3 months ago

Brief Issue Summary

CMake: Configure always uses -DCMAKE_BUILD_TYPE:STRING=Debug even if I delete CMAKE_BUILD_TYPE or set CMAKE_BUILD_TYPE=Release in setting of CMake Tools extension, and I've already set environment variable: export CMAKE_BUILD_TYPE=Release

CMake Tools Diagnostics

{
  "os": "darwin",
  "vscodeVersion": "1.90.0",
  "cmtVersion": "1.18.41",
  "configurations": [
    {
      "folder": "/Users/zz/work/cppsober/kcv",
      "cmakeVersion": "3.29.5",
      "configured": true,
      "generator": "Ninja",
      "usesPresets": false,
      "compilers": {
        "C": "/Library/Developer/CommandLineTools/usr/bin/cc",
        "CXX": "/Library/Developer/CommandLineTools/usr/bin/c++"
      }
    }
  ],
  "cpptoolsIntegration": {
    "isReady": true,
    "hasCodeModel": true,
    "activeBuildType": "Debug",
    "buildTypesSeen": [
      "Debug"
    ],
    "requests": [],
    "responses": [],
    "partialMatches": [],
    "targetCount": 7,
    "executablesCount": 1,
    "librariesCount": 3,
    "targets": [
      {
        "name": "birch-autotimer-update",
        "type": "UTILITY"
      },
      {
        "name": "imgui",
        "type": "STATIC_LIBRARY"
      },
      {
        "name": "konacv",
        "type": "STATIC_LIBRARY"
      },
      {
        "name": "test",
        "type": "EXECUTABLE"
      },
      {
        "name": "glfw",
        "type": "STATIC_LIBRARY"
      },
      {
        "name": "update_mappings",
        "type": "UTILITY"
      }
    ]
  },
  "settings": [
    {
      "communicationMode": "automatic",
      "useCMakePresets": "never",
      "configureOnOpen": false
    }
  ]
}

Debug Log

No response

Additional Information

No response

Luvideria commented 3 months ago

I would like to add that I can't find the correct way to simply add more build types. The CMakeFiles I use have for instance ServRel or ToolRel as build types, which I can't access at all.

Evelyn-001 commented 3 months ago

Thanks for reporting this issue. Today we try to repro using a simple CMake Project, but we didn't repro it. We find that if we set the "CMAKE_BUILD_TYPE": "Release" in related configuration, and the -DCMAKE_BUILD_TYPE=Release displays on CMake output when configure the project. For further investigation, could you please share us a demo project with clear repro steps? We are looking forward to hearing from you. Thanks.

ENV: VS code version: 1.90.0 CMake Extension version: 1.18.42

Please see the verified results as below. 0613VScode

zchrissirhcz commented 3 months ago

@Evelyn-001 Hi, thanks for the reply. This gif looks okay, and maybe I need a little time to learn to use CMakePresets.json. Actually I begin to use CMake since about CMake 3.12 or before that.

My previous trial was on a Apple M1 machine, which is not available now. I'm currently using a Windows 11, x86-64 machine, and I can reproduce it.

I guess Ninja as generator is the key to reproduce.

Here is the detail:

VSCode: Version: 1.90.0 VSCode CMake Tools plugin version: v1.18.42 VSCode User setting.json

{
    "cmake.generator": "Ninja",
    "cmake.pinnedCommands": [
        "workbench.action.tasks.configureTaskRunner",
        "workbench.action.tasks.runTask"
    ],
}

CMakeLists.txt

cmake_minimum_required(VERSION 3.29)
project(x)
message(STATUS "[x] CMAKE_BUILD_TYPE: ${CMAKE_BUILD_TYPE}")
add_executable(x x.c)

x.c:

int main() {}

CMake Configure output by CMake: Configure in VSCode command palette: image

Do I set CMAKE_BUILD_TYPE environment variable? No image

image

zchrissirhcz commented 3 months ago

@Evelyn-001 Using the aforementioned CMakeLists.txt and x.c files, I can reproduce the bug on my Apple-M1 machine, where I does not specify Ninja as generator:

截屏2024-06-13 20 04 06

I suggest removing the use of CMakePresets.json for a clean reproduce.

Evelyn-001 commented 3 months ago

Thanks for your reply. According to your comment, we try to repro it using above demo files, please see the verified results as below. Is it your issue? Thanks. ENV: VS code version: 1.90.0 CMake Extension version: 1.18.42 061404

zchrissirhcz commented 3 months ago

Thanks for your reply. According to your comment, we try to repro it using above demo files, please see the verified results as below. Is it your issue? Thanks. ENV: VS code version: 1.90.0 CMake Extension version: 1.18.42 061404 061404

Thanks for the reply. The verified result you provided in the gif is nearly what I thing the issue is. And to be precise, I think there are two sub-issues:

  1. When the C/C++ compiler is cl.exe, if specified Ninja as generator in settings.json, the bug appears
  2. When the C/C++ compiler is Clang, including Clang.exe from Visual Studio (for Windows), and AppleClang (for macOS), the bug appears
Evelyn-001 commented 3 months ago

This issue reproduces with below Conditions:

  1. When the C/C++ compiler is cl.exe, if specified Ninja as generator in settings.json, the bug appears
  2. When the C/C++ compiler is Clang, the bug appears

ENV: VSCode version: 1.90.1 CMake version: 3.28.3-msvc11 Ninja version: 1.11.0 VSCode CMake Tools extension version: v1.18.42

image 339677189-1b80d526-7837-4b98-ab9b-391739f02862

Evelyn-001 commented 3 months ago

@gcampbell-msft, if user do not explicitly specify a value for CMAKE_BUILD_TYPE when executing CMake, or do not explicitly set it before building, will CMake choose a default CMAKE_BUILD_TYPE of Debug? Coud you please help look at this issue? Thanks in advance.

gcampbell-msft commented 3 months ago

@Evelyn-001 Yes, if there is no CMAKE_BUILD_TYPE specified, then the default is Debug.

zchrissirhcz commented 3 months ago

@Evelyn-001 Yes, if there is no CMAKE_BUILD_TYPE specified, then the default is Debug.

😂😂 Could you please drop this default "Debug"? I think this "Debug" may sometimes become a "Bug" in my C/C++ projects

gcampbell-msft commented 3 months ago

@zchrissirhcz @Evelyn-001 Let me take some time to investigate, I actually believe I may have been wrong about our default, let me look more closely into it and get you the full understanding and context. Thanks!

gcampbell-msft commented 3 months ago

@zchrissirhcz Okay I've investigated closer and we do in fact default to "Debug". What are you expecting the default to be? I'm guessing simply an empty string?

gcampbell-msft commented 3 months ago

@zchrissirhcz Follow up to help us understand your scenario better, is there a reason that you don't want to explicitly set the build type?

zchrissirhcz commented 3 months ago

I think CMAKE_BUILD_TYPE should be set by user, and a default value provided by "VSCode CMake Tools" is not required. Consider this case: a cross-platform C/C++ project, in its CMakeLists.txt, automatically detect and set value for CMAKE_BUILD_TYPE:

cmake_minimum_required(VERSION 3.5)
projet(x)
if(NOT CMAKE_BUILD_TYPE)
  set(CMAKE_BUILD_TYPE "Release" CACHE STRING "Choose the type of build." FORCE)
endif()
message(STATUS "[x] CMAKE_BUILD_TYPE: ${CMAKE_BUILD_TYPE}")

When invoked in command like:

cmake -S . -B build

it will print [x] CMAKE_BUILD_TYPE: Release

But when invoked in VSCode CMake Tools' "cmake configure", it prints [x] CMAKE_BUILD_TYPE: Debug.

I see this usage in:

@gcampbell-msft @Evelyn-001

zchrissirhcz commented 3 months ago

@zchrissirhcz Okay I've investigated closer and we do in fact default to "Debug". What are you expecting the default to be? I'm guessing simply an empty string?

@gcampbell-msft To be precise, I expect CMake Tools extension not passing -DCMAKE_BUILD_TYPE=Debug, and also don't passing -DCMAKE_BUILD_TYPE="".

An empty string (-DCMAKE_BUILD_TYPE="") will also make existing project's CMakeLists.txt not working as expected. Just don't passing this variable by default.

If user do specify CMAKE_BUILD_TYPE in settings by UI/json file, passing that value. And this value can be one of : Debug, Release, MinSizeRel, RelWithDebInfo. And meanwhile, user can also specify other values, such as ToolRel in @Luvideria 's case.

gcampbell-msft commented 3 months ago

@zchrissirhcz Thanks for all of this information, we will definitely assess this on the backlog and investigate. Again, thanks!

Evelyn-001 commented 2 months ago

Verify this issue has been fixed. Thanks. ENV: VS code: 1.91.1 CMake Tools Extension: v1.19.19 (pre-release) 071201

smp73 commented 2 months ago

Brief Issue Summary

CMake: Configure always uses -DCMAKE_BUILD_TYPE:STRING=Debug even if I delete CMAKE_BUILD_TYPE or set CMAKE_BUILD_TYPE=Release in setting of CMake Tools extension, and I've already set environment variable: export CMAKE_BUILD_TYPE=Release

CMake Tools Diagnostics

{
  "os": "darwin",
  "vscodeVersion": "1.90.0",
  "cmtVersion": "1.18.41",
  "configurations": [
    {
      "folder": "/Users/zz/work/cppsober/kcv",
      "cmakeVersion": "3.29.5",
      "configured": true,
      "generator": "Ninja",
      "usesPresets": false,
      "compilers": {
        "C": "/Library/Developer/CommandLineTools/usr/bin/cc",
        "CXX": "/Library/Developer/CommandLineTools/usr/bin/c++"
      }
    }
  ],
  "cpptoolsIntegration": {
    "isReady": true,
    "hasCodeModel": true,
    "activeBuildType": "Debug",
    "buildTypesSeen": [
      "Debug"
    ],
    "requests": [],
    "responses": [],
    "partialMatches": [],
    "targetCount": 7,
    "executablesCount": 1,
    "librariesCount": 3,
    "targets": [
      {
        "name": "birch-autotimer-update",
        "type": "UTILITY"
      },
      {
        "name": "imgui",
        "type": "STATIC_LIBRARY"
      },
      {
        "name": "konacv",
        "type": "STATIC_LIBRARY"
      },
      {
        "name": "test",
        "type": "EXECUTABLE"
      },
      {
        "name": "glfw",
        "type": "STATIC_LIBRARY"
      },
      {
        "name": "update_mappings",
        "type": "UTILITY"
      }
    ]
  },
  "settings": [
    {
      "communicationMode": "automatic",
      "useCMakePresets": "never",
      "configureOnOpen": false
    }
  ]
}

Debug Log

No response

Additional Information

No response

12bc6cdb375f9688ba2eff535c36b26dbbaff710

Evelyn-001 commented 2 months ago

@smp73, thanks for your reply. Do you want to use -DCMAKE_BUILD_TYPE:STRING=Release ? you need to add Adding "configuration": "release" in CMakePresets.json file. Please refer to this comment in that issue. Thanks.