c++cmakevisual-studio-codevscode-tasks

How to run Cmake in Visual Studio Code using tasks


I'm trying to run cmake with ctrl+shift+B like so:

{
"version": "2.0.0",
"tasks": [
    {
        "label": "cmake",
        "type": "shell",
        "options": {
            "cwd": "${workspaceRoot}/build"
        },
        "command": "cmake ${workspaceRoot} -G \"MinGW Makefiles\"",
        (...)
    },
    {
        "label": "make",
        "type": "shell",
        "command": "mingw32-make.exe",
        "options": {
            "cwd": "${workspaceRoot}/build"
        },
       (...),
        "dependsOn":["cmake"]
    },
    {
        "label": "build",
        "type": "shell",
        "options": {
            "cwd": "${workspaceRoot}/build"
        },
        "group": {
            "kind": "build",
            "isDefault": true
        },
        "dependsOn": ["make"]
    }
]
}

But no matter what I do It runs on ${workspaceRoot} instead of the ${workspaceRoot}/build one:

Executing task in folder cpppractice: cmake C:\workspace\cpp\cpppractice -G "MinGW Makefiles"

Is there anyhting wrong with this approach? As far as I understand the cwd variable in the options item should work.


Solution

  • {
        "label": "cmake",
        "type": "shell",
        "options": {
            "cwd": "${workspaceFolder}/build"
        },
        "command": "cmake \"MinGW Makefiles\"  ${workspaceFolder}",
    },
    

    This works, It seems that the "Executing task in folder cpppractice:" is not accurate and it is executing it in the correct place, as for why it did not work previously I think it's parsing the args incorrectly? I can't confirm, but here is the output:

    Executing task in folder cpppractice: cmake "MinGW Makefiles"  
    C:\workspace\cpp\cpppractice <
    
    -- Configuring done
    -- Generating done
    -- Build files have been written to: C:/workspace/cpp/cpppractice/build
    

    Where previously it was compalining about not being able Use the generator "MinGW" which means that it separating the argument "MinGW Makefiles". After some tinkering I found out that this is also an answer:

    {
            "label": "cmake",
            "type": "shell",
            "options": {
                "cwd": "${workspaceFolder}/build"
            },
            "command": "cmake",
            "args": [
                "-G",
                "'MinGW Makefiles'",
                "./.."
            ],
            ...
        },
    

    I actually find the second approach a little bit cleaner but both work the same, So in order to pass an argument as a string you have to use single quotes like so:

    ...
    "command":"echo",
    "args": [
            "'Za Warudo!'",
        ],
    ...