My question is somewhat similar to this SO but not the same.
I created a HelloWorld
program with the following:
add_executable( HelloWorld ${SRC} )
When I generate a project file (for example a Visual Studio .sln file, or an XCode .xcodeproj file). I want to hit the run button and pass in some command line arguments to HelloWorld
when it executes the program, like the following:
./HelloWorld --gtest_filter=Test_Cases1*
Also see this SO for how this is done in Visual Studio.
Is it possible to do this in CMakeList file? If not, why?
CMake has no built-in support for this. The reason is that the settings from the Debugging
tab of Visual Studio Project properties are not stored in the project file (.vc[x]proj
), but in a user-and-machine-specific .user
file, and CMake does not generate these.
You can code it yourself in CMake (I did that for our framework at work). The file is just XML, so you can pre-populate it according to your needs. Its structure is pretty easy to understand. The command-line arguments for the program being debugged are stored in the CommandArguments
attribute inside a <DebugSettings>
XML element (nested in <Configurations><Configuration>
), for example.
Why so complicated? VS and CMake support this out of the box as described here.
Open the CMakeLists.txt file in VS, and open the "Debug and launch settings" (e.g. via the "CMake" menu or via right-click in the "Solution Explorer". E.g.:
Add your program arguments to "args" in the file "launch.vs.json" which pops up.
{
"version": "0.2.1",
"defaults": {},
"configurations": [
{
"type": "default",
"project": "CMakeLists.txt",
"projectTarget": "tests\\hellotest",
"name": "tests\\hellotest with args",
"args": ["argument after argument"]
}
]
}
CMake 3.13.0 looks like it will add support for this in the form of the following target properties:
VS_DEBUGGER_COMMAND_ARGUMENTS
- Sets the local debugger command line arguments for Visual Studio C++ targets.
VS_DEBUGGER_ENVIRONMENT
- Sets the local debugger environment for Visual Studio C++ targets.
It extends use with these commands, available since CMake 3.12:
VS_DEBUGGER_COMMAND
- Sets the local debugger command for Visual Studio C++ targets.
VS_DEBUGGER_WORKING_DIRECTORY
- Sets the local debugger working directory for Visual Studio C++ targets.
In the case you want to add E:\dev\IfcPL\examples\Trassierung.ifc
as an argument to a debug build project in Visual Studio 2017:
project.vcxproj.user.in:
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<LocalDebuggerCommandArguments>E:\dev\IfcPL\examples\Trassierung.ifc</LocalDebuggerCommandArguments>
<DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor>
</PropertyGroup>
</Project>
CMakeLists.txt:
add_executable(HelloWorld main.cpp)
configure_file(project.vcxproj.user.in ${CMAKE_BINARY_DIR}/HelloWorld.vcxproj.user)
Not a CMake trick. You can do this to set default args
for debug builds:
int main(int argc,char* argv[])
{ const char* command = argv[1];
if(argc < 2)
{
#ifdef _DEBUG
command="hello";
#else
Usage();
return 1;
#endif
}
[ process command arg... ]