How to run Cmake in Visual Studio Code using tasks

18,637

Solution 1

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

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": "${workspaceRoot}/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!'",
    ],
...

Solution 2

You pass arguments to cmake wrongly. The whole string cmake ${workspaceRoot} -G "MinGW Makefiles" is treated as a command name. Arguments must be listed in the args array.

{
    "version": "2.0.0",
    "tasks": [
        {
            "label": "cmake",
            "type": "shell",
            "options": {
                "cwd": "${workspaceRoot}/build"
            },
            "command": "cmake",
            "args": [
                "${workspaceRoot}",
                "-G",
                "\"MinGW Makefiles\""
            ]
        },
        ...
    ]
}
Share:
18,637
Immac
Author by

Immac

Senior Software Engineer, I Love videogames, especially nintendo ones, but I do play many different titles. I really like C++.

Updated on June 08, 2022

Comments

  • Immac
    Immac almost 2 years

    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.

  • Immac
    Immac about 6 years
    I had already tried this, but the output is the same: Executing task in folder cpppractice: cmake C:\workspace\cpp\cpppractice -G "MinGW Makefiles"