Home > Enterprise >  Visual Studio Code - Build and debug variable named makefile and exe
Visual Studio Code - Build and debug variable named makefile and exe

Time:11-05

I use VSC to compile and debug a CPP generated test executable. The name of the executable and makefile changes depending on which build I'm debugging, and importantly there is only ever a single executable/makefile in my workspace directory.

I'm wondering if there's a way to simply build/debug the makefile/exe that is found within the directory, as my current solution is to create a new build task/launch configuration (or update my existing configuration) for each build with the updated exe/makefile name, but this is of course not an ideal solution.

"tasks":[
   {
      "label": "Build A",
      "type": "shell",
      "command": "vcvars32.bat && nmake /nologo /S /F .\\TestA.mak",
      "group": "build",
      "options": {"cwd": "${workspaceFolder}"
   },
   {
      "label": "Build B",
      "type": "shell",
      "command": "vcvars32.bat && nmake /nologo /S /F .\\TestB.mak",
      "group": "build",
      "options": {"cwd": "${workspaceFolder}"
   },

]
"configurations":
[
   {
      "name": "Test A",
      "program": "${workspaceRoot}\\TestA.exe"
      "cwd": "${fileDirname}",
      ...
    },
    {
      "name": "Test B",
      "program": "${workspaceRoot}\\TestB.exe"
      "cwd": "${fileDirname}",
      ...
    }
]

Changing the name of the makefile/exe is not a solution here, I'm limited by the tools my org uses.

For reference, I open create a new workspace for each build. Our codebase is auto-generated code, so for each build, each required .cpp/.hpp is generated. Having a new workspace for each build means I don't have duplicates of files. I don't know if this is the optimal workflow for me.. but it works. As such, having some easily transferable/global build tasks/run configurations would make my life a little bit easier.

EDIT: I was able to set up my task.json for this, just need to figure out for launch configurations :)

"tasks":[
   {
      "label": "Build",
      "type": "shell",
      "command": "vcvars32.bat && for /r ${workspaceFolder} %i in (*.mak) do nmake /nologo /S /F %i",
      "group": "build",
      "options": {"cwd": "${workspaceFolder}"
   },
]

CodePudding user response:

Using the extension Command Variable you can add a pickFile selection:

Global tasks.json

{
  "version": "2.0.0",
  "tasks": [
    {
      "label": "Build A",
      "type": "shell",
      "command": "vcvars32.bat && nmake /nologo /S /F ${input:pickMakefile}",
      "group": "build",
      "options": {"cwd": "${workspaceFolder}",
      "problemMatcher": []
    }
  ],
  "inputs": [
    {
      "id": "pickMakefile",
      "type": "command",
      "command": "extension.commandvariable.file.pickFile",
      "args": {
        "include": "**/*.mak",
        "description": "Select a Makefile",
        "acceptIfOneFile": true
      }
    }
  ]
}

The property "acceptIfOneFile": true is implemented in v1.45.

You can do the same for your Global Launch configs in settings.json

"launch": {
  "version": "0.2.0",
  "configurations": [
    {
      "name": "Test Exe",
      "program": "${input:pickExefile}"
      "cwd": "${fileDirname}",
      ...
    }
  ],
  "inputs": [
    {
      "id": "pickExefile",
      "type": "command",
      "command": "extension.commandvariable.file.pickFile",
      "args": {
        "include": "**/*.exe",
        "description": "Select an Exe file",
        "acceptIfOneFile": true
      }
    }
  ]
}

CodePudding user response:

You can use a compound task to build using your for trick in the OP:

Global tasks.json

{
  "version": "2.0.0",
  "tasks": [
    {
      "label": "Make Build",
      "type": "shell",
      "command": "vcvars32.bat && for /r ${workspaceFolder} %i in (*.mak) do nmake /nologo /S /F %i",
      "options": {"cwd": "${workspaceFolder}",
      "problemMatcher": []
    },
    {
      "label": "Rename EXE Build",
      "type": "shell",
      "command": "for /r ${workspaceFolder} %i in (*.exe) do rename %i TestRENAME.exe",
      "options": {"cwd": "${workspaceFolder}",
      "problemMatcher": []
    },
    {
      "label": "Build",
      "group": "build",
      "dependsOn": ["Make Build", "Rename EXE Build"],
      "dependsOrder": "sequence"
    }
  ]
}

In your Global Launch config use the exe TestRENAME.exe

  • Related